会话部分响应过期

时间:2015-10-09 14:23:12

标签: ajax session jsf spring-security partial-response


我们有一个JSF 2.0,Primefaces 5.0,Spring Security 3.2.3.RELEASE应用程序。
为了处理会话超时,我使用的是primefaces idleMonitor和p:dialog& javascript显示倒计时弹出窗口并将其重定向回登录页面。
我还实现了一个自定义的CacheControlPhaseListener,以便不缓存页面。我在CacheControlPhaseListener的响应头中设置了no-cache。

<lifecycle><phase-listener id="nocache">com..filter.CacheControlPhaseListener</phase-listener></lifecycle>

我也在我的web.xml中配置了错误处理:

 <error-page>
    <exception-type>javax.faces.application.ViewExpiredException</exception-type>
    <location>/error.jsf</location></error-page>

我还实现了一个扩展ViewHandlerWrapper

的ViewExpiredHandler
@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;
}

我仍然遇到的问题是:
1。当会话在空闲页面(例如搜索页面)上到期并且如果在页面上触发某些ajax操作时,即使我退出,当我导航回页面时(例如,登录 - >主页 - >搜索页面)。我看到部分响应xml错误:

<partial-response><changes><update id="blGridId"><table id="blGridId" style="width:100%;"> <tbody> <tr> <td><div id="blTableId" class="ui-datatable ui-widget ui-datatable-scrollable ui-datatable-resizable"><div id="sublTableId_paginator_top" class="ui-paginator ui-paginator-top ui-widget-header ui-corner-top" role="navigation"><span class="ui-paginator-prev ui-state-default ui-corner-all ui-state-disabled"><span class="ui-icon ui-icon-seek-prev">p</span></span><span class="ui-paginator-next ui-state-default ui-corner-all ui-state-disabled"><span class="ui-icon ui-icon-seek-next">p</span></span></div><div class="ui-widget-header ui-datatable-scrollable-header"><div class="ui-datatable-scrollable-header-box"><table role="grid"><thead id="blTableId_head"><tr role="row"><th id="blTableId:j_idt101" class="ui-state-default ui-resizable-column" role="columnheader" style="width:34px; #width:37px;"><span class="ui-column-title"><span style="word-wrap: break-word;white-space: normal;">Client </span></span></th><th id="blTableId:j_idt104" class="ui-state-default


2。如果我点击浏览器刷新,它会加载回页面,我可以继续操作。
除上述内容外,请告诉我需要做的事情,以解决部分响应错误。我是否需要添加servlet过滤器以使会话无效? 我非常感谢任何帮助和反馈,因为它是高度优先的。

1 个答案:

答案 0 :(得分:0)

会话过期后,我遇到了同样的问题。我认为为时已晚,但对于像我这样有问题的人来说可能会有所帮助。

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

轻松解决此问题的方法是删除Spring Security的保存行为。 SavedRequestAwareAuthenticationSuccessHandler 类用于处理这类行为。配置为:

<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"/>

希望它会有所帮助。