为什么 /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.