注销与Spring和Thymeleaf的链接

时间:2014-03-21 11:39:04

标签: spring spring-mvc spring-security thymeleaf

根据官方示例(Secure Web Content),我必须使用表单和按钮,目的是使用Spring Security执行注销。 有没有办法使用Thymeleaf的链接而不是按钮?

6 个答案:

答案 0 :(得分:19)

您必须使用表单进行注销。如果您真的想要一个链接,可以使用JavaScript让链接在隐藏表单上执行POST。

<a href="javascript: document.logoutForm.submit()" role="menuitem"> Logout</a>

   <form name="logoutForm" th:action="@{/logout}" method="post" th:hidden="true">
      <input hidden type="submit" value="Sign Out"/>
   </form> 

答案 1 :(得分:15)

我已成功使用<a th:href="@{/logout}">Logout</a>

我使用的相关Spring Security配置是

 http
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/login");

答案 2 :(得分:8)

关于这个问题的上下文,我认为vdenotaris想要一个链接而不是注销功能的提交按钮。好吧,我认为你能做的就是创建一个这样的超链接:

<a href="#" th:href="@{/logout}">Log Out</a>

现在创建一个带有以下映射的控制器:

@RequestMapping(value="/logout", method = RequestMethod.GET)
public String logoutPage (HttpServletRequest request, HttpServletResponse response) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    if (auth != null){    
        new SecurityContextLogoutHandler().logout(request, response, auth);
    }
    return "redirect:/login?logout";
}

答案 3 :(得分:7)

解决方案(已弃用!)是:

       .logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login");

如上所述,建议使用POST而不是GET请求来保证安全性。

答案 4 :(得分:6)

这是正确的答案。

<form th:action="@{/logout}" method="post">
    <input type="submit">POST LOGOUT</input>
</form>

答案 5 :(得分:2)

“为了帮助防止CSRF攻击,默认情况下,Spring Security Xml配置注销需要:

  • HTTP方法必须是POST
  • 必须将CSRF令牌添加到 请求。您可以使用该属性在ServletRequest上访问它 _csrf如上图所示。“

Hello Spring Security Xml Config

IActionResult