Я хочу создать административный портал для управления книгами (получение, добавление, удаление, обновление книги). Итак, я начал с функции входа / выхода; часть входа в систему работает как шарм, но у меня возникла проблема с выходом из системы. Когда я выхожу из системы, портал администратора поддерживает сеанс и не убивает его, и я не могу получить в журнале никаких ошибок, подтверждающих эту проблему.
Ниже фрагмент кода, который отвечает на почтовый запрос на выход из системы:
@RequestMapping(value = "/user/logout", method = RequestMethod.POST)
public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response) {
SecurityContextHolder.clearContext();
return new ResponseEntity("Logout Successful !", HttpStatus.OK);
}
В клиенте я использую Angular для отправки почтового запроса на мой локальный сервер. Ниже службы выхода из системы:
logout(){
let url = "http://localhost:8090/user/logout";
const xToken = localStorage.getItem('xAuthToken');
let headers=new Headers({
'x-auth-token':xToken,
});
return this.http.post(url,{headers:headers});
}
Переменная xToken получает токен сеанса из локального хранилища браузера.
Каждый раз, когда мы проверяем, сохраняется ли сессия в ngOnInit компонента входа в систему:
ngOnInit() {
this.login.checkSession().subscribe(
res=>{
this.loggedIn=true;
},
err=>{
console.info(err);
this.loggedIn=false;
}
)
}
Сервис, отвечающий за проверку сеанса, подробно описан ниже:
checkSession(){
let url = "http://localhost:8090/checkSession";
const xToken = localStorage.getItem('xAuthToken');
const basicHeader = 'Basic ' + localStorage.getItem('credentials');
let headers=new Headers({
'x-auth-token':xToken,
'Authorization':basicHeader
});
return this.http.get(url,{headers:headers});
}
Для проверки сеанса мы запрашиваем сервер:
@RequestMapping("/checkSession")
public ResponseEntity checkSession() {
System.out.print("Session Active !");
return new ResponseEntity("Session Active !", HttpStatus.OK);
}
Константа basicHeader - это схема аутентификации, которая содержит закодированную комбинацию имени пользователя и пароля, хранящуюся в локальном хранилище браузера.
для получения дополнительной информации ниже, как мы отправляем учетные данные на сервер:
onSubmit(){
this.login.sendCredentials(this.credentials.username,this.credentials.password).subscribe(
res=>{
console.info(res);
localStorage.setItem('xAuthToken', res.json().token);
this.loggedIn=true;
const encodedCredentials = btoa(this.credentials.username + ':' + this.credentials.password);
localStorage.setItem("credentials",encodedCredentials);
location.reload();
},err=>{
console.info(err);
}
)
}
Пожалуйста, любая помощь очень ценится. Заранее благодарим за решение этой проблемы
когда я вызываю просто '/ logout', он показывает мне ошибку «локальный: 4200 / войти? выйти 404 not found», я думаю, это связано с формальностью весенней безопасности при использовании почтового запроса





Функция logout поддерживается Spring Security из коробки, для этого просто требуется некоторая настройка:
@EnableWebSecurity
@Configuration
public class SecurityConf extends WebSecurityConfigurerAdapter {
@Override
public void configure(HttpSecurity http) {
http
.httpBasic().and() // HTTP Basic authorization or whichever
.authorizeRequests()
.antMatchers(...).permitAll()
.anyRequest().authenticated().and()
...
.logout();
}
...
}
Затем метод /logout доступен на http://localhost:8080/logout через метод POST, если ваше приложение запущено на localhost через порт 8080.
Подробнее Документ Spring Security
@WilDev Я добавляю эту конфигурацию, но она не работает. Я думаю, мне следует добавить некоторые функции в общедоступный ResponseEntity logout () контроллера отдыха, чтобы аннулировать текущий активный сеанс.
@MohamedAoutir, метод предоставляется Spring Security, ручная реализация не требуется. Прямой запрос POST к конечной точке http://localhost:8090/logout должен помочь
@Wildev, когда я выхожу из системы, я очищаю хранилище браузера в клиенте, набирая localstorage.clear (), и у меня это работает.
Я наблюдаю такое же поведение: мой контроллер выхода из системы НЕ вызывается, и файл cookie CAS не очищается. Я могу войти в систему только как тот же пользователь, пока не удалю этот файл cookie. Я не могу войти под другим именем.
почему вы не вызываете просто выход из системы? я имею в виду '/ выход из системы'