当前位置: 首页 > 知识库问答 >
问题:

为什么/logout调用抛出“Method not Allowed”?

全昊焜
2023-03-14

我的应用程序使用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();
}

所以.../loginendpoint的工作是正确的。但/logoutendpoint工作不正确。当调用/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和会话都被删除了,也就是说logout的工作是正确的,但是为什么它会返回这个JSON呢?

共有1个答案

解晟睿
2023-03-14

我通过logoutsuccesshandler设置解决了该问题:

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

现在/logout调用返回200 OK。

 类似资料:
  • 问题内容: final Multimap terms = getTerms(bq); for (Term t : terms.keySet()) { Collection C = new HashSet(terms.get(t)); if (!C.isEmpty()) { for (Iterator it = C.iterator(); it.hasNext();) { BooleanClause

  • 问题内容: 我试图将两个’Employee’对象添加到TreeSet中: 但是它抛出一个ClassCastException: 但是,如果我仅将一个对象添加到TreeSet中: 或者,如果我改用HashSet: 那就成功了。为什么会发生异常,我该如何解决? 问题答案: 要么必须实现,或者你需要提供一个比较创建时。 在文档中对此进行了详细说明: 插入排序集中的所有元素都必须实现接口(或被指定的比较器

  • 问题内容: 将字符串解析为字节时出现异常 问题答案: 这是因为默认的parse方法要求使用十进制格式的数字来解析十六进制数字,请使用以下parse: 其中16是解析的基础。 至于您的评论,您是对的。字节的最大值为0x7F。因此,您可以将其解析为并执行二进制与操作以获得LSB,即您的字节:

  • 问题内容: 我有这种方法: 映射: Person.hbm.xml Cars.hbm.xml 此方法适用于单个线程,并且在多个线程上,给我一个错误: AOP交易: 注意:当我在更新后添加Thread.sleep(5000)时,就可以了。 但是这种解决方案并不干净。 问题答案: 我有汽车->(1-n)个地方。而且我在表位置(id_car)有一个外键。此外键没有索引。当我向该外键添加索引时,我的问题已解

  • 当使用Mockito截尾时,我们通常为一个方法指定一个具体的参数。之后,我们可以用相同的参数调用Stubed方法。例如,在下面的代码中,get()用参数0进行了stubed。所以,当调用get()时,get()的参数也是0。因此,get()将返回一个整数,即3。 如果调用语句被修改为: 即参数更改为1,然后Mockito抛出“NullPointerException”,而不是“AssertionE

  • 下面是我的代码: 现在我的脑海中应该不会出现不匹配,因为显然提取了两个整数?!