TIMEOUT后重定向到上一个URL

时间:2016-12-21 09:37:27

标签: spring-security

我使用的是Spring 3.1版本。

我已经实现了spring security以登录我的门户网站。除了一个问题,它工作正常。我已将会话超时设置为2分钟。

一旦发生超时,然后用户点击任何URL,它就会被重定向到注销页面。但是当用户重新进行身份验证时,用户直接登陆主页,这是默认目标URL而不是最后一个访问页面。

如果用户被访问/home/editproduct,那么在超时&当他再次进行重新认证时,应该访问home/editproduct而不是/home页面。

我正在使用JSON& AJAX电话。

<bean id="myNePublicUserNamePasswordAuthFilter"
class="com.ne.mynelson.authentication.publicuser.MyNePublicUserPasswordAuthFilter">
    <property name="filterProcessesUrl" value="/service/json_authentication_check"></property>
    <property name="authenticationManager" ref="myNePublicUserAuthenticationManager" />
    <property name="authenticationFailureHandler" ref="failureHandler" />
    <property name="authenticationSuccessHandler" ref="successHandler" />
    <property name="authenticationInputProcessor" ref="myNePublicUserAuthInputProcessor"></property>
</bean>
<bean id="successHandler"
class="com.ne.mynelson.authentication.publicuser.MyNePublicUserAuthSuccessHandler">
    <property name="authHandlerView" ref="authHandlerView"></property>
    <property name="sessionRegistry" ref="sessionRegistry"></property>
    <property name="publicLoginManager" ref="publicLoginManager"></property>
</bean>

1 个答案:

答案 0 :(得分:0)

编辑:SessionManagementFilter

您需要实现InvalidSessionStrategy,覆盖onInvalidSessionDetected方法,就像SimpleRedirectInvalidSessionStrategy一样,但在重定向之前,您需要创建一个新会话,并将请求保存到会话。

HttpSession session = request.getsession(false);
if (session != null) {
    // for creating a new session
    session.invalidate();
}
DefaultSavedRequest savedRequest = new DefaultSavedRequest(request,
                    new PortResolverImpl());
request.getSession(true).setAttribute("SPRING_SECURITY_SAVED_REQUEST", savedRequest);
redirectStrategy.sendRedirect(request, response, destinationUrl);

然后将此bean注入SessionManagementFilter

编辑:对于ConcurrentSessionFilter

如果你使用concurrentSessionFilter,你可以实现SessionInformationExpiredStrategy,就像SimpleRedirectSessionInformationExpiredStrategy一样,在方法onExpiredSessionDetected中,仍然像我上面发布的一样,在重定向之前,创建新会话,并将保存请求放入新会话,您可以通过event.getRequest()获取请求,然后将此sessionInfomationExpiredStrategy注入concurrentSessionFilter

public void onExpiredSessionDetected(SessionInformationExpiredEvent event) throws IOException {
    logger.debug("Redirecting to '" + destinationUrl + "'");
    DefaultSavedRequest savedRequest = new DefaultSavedRequest(event.getRequest(),
                        new PortResolverImpl());
    request.getSession(true).setAttribute("SPRING_SECURITY_SAVED_REQUEST", savedRequest);
    redirectStrategy.sendRedirect(event.getRequest(), event.getResponse(), destinationUrl);
}

最后,使用SavedRequestAwareAuthenticationSuccessHandler代替SimpleUrlAuthenticationSuccessHandler。它将尝试获取请求目标URL,然后重定向到保存的URL。