会话超时后是否可以获取用户名/上次访问的页面

时间:2012-11-06 08:22:11

标签: java spring cookies spring-security httpresponse

在我的应用程序中,我有一个invalid-session-url,我想知道是否可以在invalid-session-url中获取用户名?如果是这样,请告知如何做到这一点。

1 个答案:

答案 0 :(得分:1)

是的,有可能。在用户通过身份验证时,您可以使用其用户名的值将cookie发送到用户的Web浏览器。会话过期后,您仍然可以访问该cookie。您需要做的就是将其生命周期设置得足够长。

您可以实施自己的Filter。我建议扩展UsernamePasswordAuthenticationFilter。覆盖Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)可让您访问Cookie - 您可以使用HttpServletResponse.addCookie(Cookie cookie)添加一个。

您可以轻松注入自己的过滤器。有关config:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#nsa-custom-filter

的更多信息

还要考虑到发送这样的cookie可能不安全。我没有看到任何其他方式来实现你想要的。 但您可以通过配置LogoutHandler轻松提高此解决方案的安全性。这个接口CookieClearingLogoutHandler有一个实现。当用户决定手动注销时,您可以使用它来清除该cookie。

<bean id="cookieClearingLogoutHandler" class="org.springframework.security.web.authentication.logout.CookieClearingLogoutHandler">
    <constructor-arg>
        <!-- Names of the cookies you want to remove when user logs out -->
        <list>
            <value>username</value>
        </list>
    </constructor-arg>
</bean>

<bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
    <constructor-arg value="/login"/>
    <constructor-arg>
        <array>
            <ref local="securityContextLogoutHandler"/>
            <!-- Inject it -->
            <ref local="cookieClearingLogoutHandler"/>
        </array>
    </constructor-arg>
    <property name="filterProcessesUrl" value="/logout"/>
</bean>