为什么 /logout 调用会抛出 "Method not allowed"?
Why /logout calling throws "Method not allowed"?
我的应用程序使用 Spring 会话 (使用 Redis)。我使用自定义登录控制器,因为我使用外部 React 客户端,而不是默认的 Spring 登录页面。
登录控制器:
@PostMapping(value = "/login", consumes = MediaType.APPLICATION_JSON_VALUE)
public String login(@RequestBody LoginDataTo loginData) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
loginData.getEmail(),
loginData.getPassword());
Authentication authentication = this.authenticationManager.authenticate(token);
SecurityContextHolder
.getContext()
.setAuthentication(authentication);
return "OK";
}
安全配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
http
.httpBasic().disable()
.formLogin().disable() // login form is disable, because i use external React client
.csrf().disable()
.cors().disable();
http
.logout()
.logoutUrl("/logout")
.invalidateHttpSession(true);
http
.authorizeRequests()
.antMatchers("/login").anonymous()
.antMatchers("/logout").authenticated()
.anyRequest().authenticated();
}
所以... /login
端点的工作是正确的。但是 /logout
端点工作不正确。当调用 /logout
时,它 returns json:
{
"timestamp": "2021-03-30T13:45:09.142+00:00",
"status": 405,
"error": "Method Not Allowed",
"message": "",
"path": "/login"
}
这是我在 Postman 中使用的请求:
GET http://localhost:8080/logout
cookie和session都删除了,也就是说logout的工作是正确的,但是为什么会返回这个json?
我通过logoutSuccessHandler
设置解决了这个问题:
http
.logout()
.invalidateHttpSession(true)
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK));
现在 /logout
调用 returns 200 OK.
我的应用程序使用 Spring 会话 (使用 Redis)。我使用自定义登录控制器,因为我使用外部 React 客户端,而不是默认的 Spring 登录页面。
登录控制器:
@PostMapping(value = "/login", consumes = MediaType.APPLICATION_JSON_VALUE)
public String login(@RequestBody LoginDataTo loginData) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
loginData.getEmail(),
loginData.getPassword());
Authentication authentication = this.authenticationManager.authenticate(token);
SecurityContextHolder
.getContext()
.setAuthentication(authentication);
return "OK";
}
安全配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
http
.httpBasic().disable()
.formLogin().disable() // login form is disable, because i use external React client
.csrf().disable()
.cors().disable();
http
.logout()
.logoutUrl("/logout")
.invalidateHttpSession(true);
http
.authorizeRequests()
.antMatchers("/login").anonymous()
.antMatchers("/logout").authenticated()
.anyRequest().authenticated();
}
所以... /login
端点的工作是正确的。但是 /logout
端点工作不正确。当调用 /logout
时,它 returns json:
{
"timestamp": "2021-03-30T13:45:09.142+00:00",
"status": 405,
"error": "Method Not Allowed",
"message": "",
"path": "/login"
}
这是我在 Postman 中使用的请求:
GET http://localhost:8080/logout
cookie和session都删除了,也就是说logout的工作是正确的,但是为什么会返回这个json?
我通过logoutSuccessHandler
设置解决了这个问题:
http
.logout()
.invalidateHttpSession(true)
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK));
现在 /logout
调用 returns 200 OK.