why/logout调用抛出“method not allowed”?

afdcj2ne  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(402)

我的应用程序使用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 ,返回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被删除了,也就是说注销的工作是正确的,但是为什么它返回这个json呢?

8hhllhi2

8hhllhi21#

我用计算机解决了这个问题 logoutSuccessHandler 设置:

http
    .logout()
    .invalidateHttpSession(true)
    .logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler(HttpStatus.OK));

现在 /logout 呼叫返回200 ok。

相关问题