Spring Security – 无法注销

我是Spring Framework的初学者。 我和我的朋友正在波兹南理工大学写我们的工程论文,我们遇到了Spring Security(3.1.0)的问题。 我不能很好地退出。 当我想再次登录时,我看到消息“用户已经登录”(我覆盖了标准的Spring Security错误消息)。 我试图清除SecurityContextHolder的上下文,但它仍然无法正常工作。

弹簧security.xml文件

              ` 

web.xml中

   springSecurityFilterChain  org.springframework.web.filter.DelegatingFilterProxy    springSecurityFilterChain /*  

针对home.jsp

 <a href="https://stackoverflow.com/questions/13920729/spring-security-cannot-logout/">Logout 

Controller.java

 @RequestMapping(value = "logout") public String logout() { SecurityContextHolder.clearContext(); return "redirect:/j_spring_security_logout"; } @RequestMapping(value = "start") public String start(Model model, HttpServletRequest request) { // sprawdzenie czy uzytkownik nie jest juz zalogowany if (request.getRemoteUser() == null) { return "start"; } else { return "redirect:/home"; } } 

我有自己的提供商来检查登录名和密码。

AuthProvider.java

 public class AuthenticationProvider implements AuthenticationProvider{ private Logger logger = Logger.getLogger(AuthenticationProvider.class); @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { List authorities = new ArrayList(); authorities.add(new GrantedAuthorityImpl("ROLE_USER")); UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication; String username = String.valueOf(auth.getPrincipal()); String password = String.valueOf(auth.getCredentials()); if(username.length()<4) { logger.warn("Error: Login is to short for username: "+ username); throw new BadCredentialsException("Login is to short!"); } else if(password.length()<4) { logger.warn("Error: Password is to short for username: "+ username); throw new BadCredentialsException("Password is to short!"); } else if(!( (username.equals("login") & password.equals("password"))| (username.equals("login2") & password.equals("password2"))) ) { logger.warn("Error: Incorrect data for username: "+ username); throw new BadCredentialsException("Incorrect data!"); } return new UsernamePasswordAuthenticationToken( authentication.getName(), authentication.getCredentials(), authorities); } @Override public boolean supports(Class authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } 

}

我试图解决它,我看起来很长时间,但我找不到解决方案。

我希望你帮助我。

Mateusz Jarmuzek,Lukasz Grzybowski

编辑:我覆盖了标准的Spring Security错误消息。

更改后的代码。

Controller.java

  @RequestMapping(value = "dummy") public String dummy() { //SecurityContextHolder.clearContext(); return "redirect:/dummy"; } @RequestMapping(value = "logout") public String logout() { //SecurityContextHolder.clearContext(); return "redirect:/start"; } 

dummy.jsp

     <%--  --%>   

针对home.jsp

 <a href="https://stackoverflow.com/questions/13920729/spring-security-cannot-logout/">Logout 

在JSP重定向中但在设置中没有问题。

尝试这个:

添加到web.xml

   org.springframework.security.web.session.HttpSessionEventPublisher   

Spring安全注销的标准如下:

 SecurityContextHolder.clearContext(); 

编辑

如果您正在使用jsp重定向,那么您需要一个空的jsp来执行以下操作:

1)使会话无效
2)重定向到登录页面

当我说空时我的意思是它里面唯一的内容是一个执行上述两个部分的scriptlet。 因此,该过程将如下所示:

1)用户按下注销
2)发生如上所述的重定向到虚拟页面
3)虚拟页面执行其代码
4)用户现在已退出系统。

JSP代码

  <%session.invalidate()%> //redirect logic