2011-09-06 19 views
8

Od pewnego czasu próbuję zrozumieć wiosenną ochronę, a ja dostałem z większością rzeczy poza aspektem logout. Przechodząc przez inne pytania na temat SO, czułem, że większość z nich boryka się z problemami związanymi z sesją, która nie kończy się.Wylogowanie z wylogowania wiosennego powoduje NullPointerException

Ja natomiast mam do czynienia z różnymi rodzajami kłopotów. Mój plik XML zabezpieczeń jest skonfigurowany w następujący sposób:

<http path-type="ant" auto-config="false" use-expressions="true" 
    access-denied-page="/?login_error=2"> 
    <intercept-url pattern="/web/open/**" access="permitAll" /> 
    <intercept-url pattern="/web/**" access="isAuthenticated()" /> 

    <form-login login-processing-url="/static/j_spring_security_check" 
     default-target-url="/web/base/view" always-use-default-target="true" 
     login-page="/" authentication-failure-url="/?login_error=1" /> 

    <logout logout-url="/static/j_spring_security_logout" 
     invalidate-session="true" logout-success-url="/" /> 
</http> 

W moim web.xml ja już zmapowali login controller do korzenia kontekstowego [Using listę welcome-file], a także posiadają wymagane springSecurityFilterChain konfigurację. Teraz operacje logowania przebiegają idealnie. Docelowa JSP ma link wylogowania jako:

<a href="<c:url value="/static/j_spring_security_logout"/>">Logout</a> 

Jednak, gdy klikam na link wylogowania, pojawia się upiorny NullPointerException. Czy ktoś może mi powiedzieć, czy popełniam jakiś rażący błąd?


Wyjątek stosu:

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) 

Dzięki za poświęcenie czasu.

Odpowiedz

12

Metoda determineTargetUrl w AbstractAuthenticationTargetUrlRequestHandler wydaje się nie być w stanie uzyskać parametrów żądania. Dla mnie zwykle dobrze jest podać defaultTargetUrl i ustawić alwaysUseDefaultTargetUrl na true, która oznacza, że ​​determineTargetUrl zawsze zwraca podany adres URL i zapobiega magii określania adresu URL.

zrobiłbym to rejestrując własne LogoutSuccessHandler wdrożenia jak:

<logout 
    logout-url="/static/j_spring_security_logout" 
    invalidate-session="true" 
    success-handler-ref="myLogoutSuccessHandler" /> 

zamiast logout-success-url.

LogoutSuccessHandler może wyglądać tak proste, jak:

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); 
    } 
} 

Ustaw wylogowania URL jako defaultTargetUrl w kontekście zabezpieczeń przy określaniu fasolkę do zwyczaju LogoutSuccessHandler:

<bean id="myLogoutSuccessHandler" class="foobar.impl.MyLogoutSuccessHandler"> 
    <property name="defaultTargetUrl" value="/" /> 
    <property name="alwaysUseDefaultTargetUrl" value="true" /> 
</bean> 
+0

'rozciąga AbstractAuthenticationTargetUrlRequestHandler realizuje LogoutSuccessHandler' można zastąpić przez 'extends SimpleUrlLogoutSuccessHandler'. – lschin

+0

gee - twoja rada zadziałała, ale to nie ma dla mnie żadnego sensu. żadna z dokumentacji nie wspomina o czymś takim. nie rozumiem, dlaczego 'logout' nie działa bez' ref-handler'a '? – anirvan

+2

@Ischin: w rzeczywistości nie potrzebujesz własnej implementacji. ' ...' wystarczy - ale może chcesz zrobić kilka innych rzeczy. – jeha

Powiązane problemy