Ajax 会话过期时的部分响应

Ajax 会话过期时的部分响应,ajax,session,jsf,spring-security,partial-response,Ajax,Session,Jsf,Spring Security,Partial Response,我们有一个JSF2.0、PrimeFaces5.0、SpringSecurity3.2.3.RELEASE应用程序。 为了处理会话超时,我使用primefaces idleMonitor和p:dialog&javascript显示一个倒计时弹出窗口,并将它们重定向回登录页面。 我还实现了一个定制的CacheControlPhaseListener,这样页面就不会被缓存。我在CacheControlPhaseListener中的响应头中设置了无缓存 <lifecycle><pha

我们有一个JSF2.0、PrimeFaces5.0、SpringSecurity3.2.3.RELEASE应用程序。 为了处理会话超时,我使用primefaces idleMonitor和p:dialog&javascript显示一个倒计时弹出窗口,并将它们重定向回登录页面。 我还实现了一个定制的CacheControlPhaseListener,这样页面就不会被缓存。我在CacheControlPhaseListener中的响应头中设置了无缓存

<lifecycle><phase-listener id="nocache">com..filter.CacheControlPhaseListener</phase-listener></lifecycle>
我仍然面临的问题是: 1.当会话在空闲页面(如搜索页面)上过期,并且当我导航回该页面(如登录->主页->搜索页面)时,如果某个页面上触发了某些ajax操作(即使我注销)。我看到一个部分响应xml错误:


ppClient当会话过期时,我也遇到了同样的问题。我觉得太晚了,但也许对像我这样有问题的人会有帮助

根本原因是Spring Security在重定向客户端进行身份验证之前保存了最后一个请求。之后,当用户访问最后一个请求的页面时,Spring security将再次尝试执行该请求。不幸的是,请求是ajax/partial,其视图已过期->返回了部分xml内容

解决此问题的简单方法是删除SpringSecurity的保存行为。SavedRequestStataWareAuthenticationSuccessHandler类用于处理此类行为。配置为:

<bean id="authenticationFilter"  class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"
        p:authenticationManager-ref="authenticationManager"
        p:authenticationFailureHandler-ref="authenticationFailureHandler"
        p:authenticationSuccessHandler-ref="authenticationSuccessHandler"
        p:usernameParameter="username"
        p:passwordParameter="password">
    </bean>
... 

<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"
        p:defaultTargetUrl="/"
        p:alwaysUseDefaultTargetUrl="true"/>

希望能有所帮助。

@BalusC:我不太清楚中给出的解决方案-登录后是否需要重定向到默认页面?使用相同的设置。也就是说,告诉Spring security在登录后总是重定向到给定的目标URL。好的,谢谢,我会试试。@BalusC:我检查了,我们已经配置了默认的目标URL。下面是弹簧配置:。。。。“但是,错误仍然发生
@Override
public UIViewRoot restoreView(FacesContext ctx, String viewId)
{
    UIViewRoot viewRoot = super.restoreView(ctx, viewId);
    try
    {
        if (viewRoot == null)
        {
            viewRoot = super.createView(ctx, viewId);
            ctx.setViewRoot(viewRoot);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    return viewRoot;
}
<bean id="authenticationFilter"  class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"
        p:authenticationManager-ref="authenticationManager"
        p:authenticationFailureHandler-ref="authenticationFailureHandler"
        p:authenticationSuccessHandler-ref="authenticationSuccessHandler"
        p:usernameParameter="username"
        p:passwordParameter="password">
    </bean>
... 

<bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler"
        p:defaultTargetUrl="/"
        p:alwaysUseDefaultTargetUrl="true"/>