spring security logout导致NullPointerException

我一直试图了解弹簧安全性一段时间,除了logout方面,我已经解决了大部分问题。 通过关于SO的其他问题,我觉得他们中的大多数都面临与会话无关的问题。

另一方面,我面临着相当不同的麻烦。 我的安全XML文件配置如下:

       

在我的web.xml我已经将login controller映射到上下文根[使用welcome-file列表],并且还具有所需的springSecurityFilterChain设置。 现在登录操作运行完美。 目标JSP具有注销链接:

 <a href="https://stackoverflow.com/questions/7325655/spring-security-logout-causes-nullpointerexception/">Logout 

但是,每当我点击注销链接时,我都会遇到可怕的NullPointerException 。 如果我在这里犯了一些明显的错误,有人能告诉我吗?


exception堆栈:

 java.lang.NullPointerException at java.util.Hashtable.get(Hashtable.java:334) at org.apache.tomcat.util.http.Parameters.getParameterValues(Parameters.java:116) at org.apache.tomcat.util.http.Parameters.getParameter(Parameters.java:127) at org.apache.catalina.connector.Request.getParameter(Request.java:1133) at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:384) at javax.servlet.ServletRequestWrapper.getParameter(ServletRequestWrapper.java:140) at org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler.determineTargetUrl(AbstractAuthenticationTargetUrlRequestHandler.java:86) at org.springframework.security.web.authentication.AbstractAuthenticationTargetUrlRequestHandler.handle(AbstractAuthenticationTargetUrlRequestHandler.java:67) at org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler.onLogoutSuccess(SimpleUrlLogoutSuccessHandler.java:28) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:100) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:381) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:168) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 

感谢您抽出宝贵的时间。

获取请求参数时, AbstractAuthenticationTargetUrlRequestHandlerdetermineTargetUrl方法似乎失败。 对我来说,通常可以提供defaultTargetUrl并将alwaysUseDefaultTargetUrl设置为true ,其中determineTargetUrl始终返回给定的URL并阻止URL确定魔术。

我通过注册我自己的LogoutSuccessHandler实现来做到这一点,如:

  

而不是logout-success-url

LogoutSuccessHandler看起来很简单:

 public class MyLogoutSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler implements LogoutSuccessHandler { @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication throws IOException, ServletException { // maybe do some other things ... super.handle(request, response, authentication); } } 

在为自定义LogoutSuccessHandler定义bean时,在安全上下文中将注销URL设置为defaultTargetUrl