Java JSF2;AJAX会话过期时从筛选器重定向会导致客户端浏览器不更新页面

Java JSF2;AJAX会话过期时从筛选器重定向会导致客户端浏览器不更新页面,java,ajax,jsf-2,servlet-filters,Java,Ajax,Jsf 2,Servlet Filters,这个问题与这个问题非常相似: 但这个解决方案对我不起作用。我错过了一些东西 问题是: 当会话过期,我单击一些ajax链接/按钮并发送重定向(从过滤器)时,浏览器不会更新页面并接收最后一个非ajax请求的页面 我得到的是: WebSphere上的JSF2.1(我也使用RichFaces4.2.0) 我使用AJAX(除了登录后的第一个请求) 我将@ManagedBean(name=“user”)@SessionScoped UserBean与字段user-user一起使用(这反过来是用于用户访问管理

这个问题与这个问题非常相似: 但这个解决方案对我不起作用。我错过了一些东西

问题是: 当会话过期,我单击一些ajax链接/按钮并发送重定向(从
过滤器
)时,浏览器不会更新页面并接收最后一个非ajax请求的页面

我得到的是:

  • WebSphere上的JSF2.1(我也使用RichFaces4.2.0)
  • 我使用AJAX(除了登录后的第一个请求)
  • 我将
    @ManagedBean(name=“user”)@SessionScoped UserBean
    与字段
    user-user
    一起使用(这反过来是用于用户访问管理的EJB实体类)
  • 我使用OmniFaces类来执行
    FullAjaxExceptionHandler
    (感谢BalusC,没有我的过滤器,它工作得很好)
  • 我使用映射到
    @WebFilter(*.xhtml”)
    javax.servlet.Filter
    来管理对资源的访问和登录检查<代码>doFilter()函数片段:

    。。。。
    if(user==null){//if用户未登录
    重定向至登录(请求、回复);
    }
    
    在同一个过滤器类中有
    redirectToLogin()
    函数(再次感谢BalusC(=):

    private static final String FACES\u REDIRECT\u XML=“”
    + "";
    受保护的void redirectToLogin(ServletRequest req、ServletResponse res)引发IOException{
    HttpServletRequest请求=(HttpServletRequest)请求;
    if(“partial/ajax.equals”(request.getHeader(“Faces request”)){
    res.setContentType(“text/xml”);
    res.setCharacterEncoding(“UTF-8”);
    res.getWriter().printf(FACES_REDIRECT_XML,request.getContextPath()+“/login.xhtml”);
    }否则{
    字符串url=request.getContextPath()+“/login.xhtml”;
    HttpServletResponse resHttp=(HttpServletResponse)res;
    resHttp.sendRedirect(url);
    }
    }
    
  • 当会话过期时,我单击一些ajax链接/按钮(ViewExpiredException发生)。我可以在调试中看到字符串
    res.getWriter().printf(FACES_REDIRECT_XML,request.getContextPath()+“/login.xhtml”);
    执行。我还可以看到HTTP重定向请求和带有login.xhtml的响应(这不是登录页面,这是发出最后一个非AJAX请求的旧页面!)Firebug中的页面,但浏览器不会更新视图

    我是否可以检测到ViewExpiredException发生在筛选器(FacesContext外部)中,并将控制权传递给FullAjaxExceptionHandler?(顺便说一句,如果可能的话,我不需要ajaxExceptionHandler处理ViewExpiredException,对吗?) 浏览器页面未更新的原因是什么

    正如我在文章顶部提到的,我阅读并遵循了相关的指导方针,但我遗漏了什么或误解了什么。可能是什么

    谢谢


    更新:我收到的HTML代码是上次非AJAX请求返回的旧HTML页面!所以FacesServlet不会将我的login.xhtml发送到客户端浏览器


    Update2:我发现我从Fasservlet收到的页面是最后一个非AJAX请求的页面(在我的情况下,这是我成功登录后看到的第一个视图)。(顺便说一句,浏览器仍然没有更新页面,并且有XML解析错误,这是由以下行引起的:
    “我还可以通过Firebug中的login.xhtml页面看到HTTP重定向请求和响应”这是HTTP 200 GET请求吗?整个
    login.xhtml
    HTML输出都在“响应”中“tab?或者你看到原始JSF源代码了吗?你的
    FacesServlet
    映射到了什么URL模式?过滤器中的代码假设它是
    *.xhtml
    .1)我的FacesServlet映射到了*.xhtml.2)是的,它是HTTP 200 GET请求,作为响应,我可以看到已处理的HTMLcode@BalusC如果我调用
    chain.doFilter(req,res)呢
    在我的
    过滤
    中,然后在
    FullAjaxExceptionHandler
    RESTORE\u VIEW
    阶段以某种方式处理
    ViewExpiredException
    中的
    功能性?我不使用第三方框架(我相信是这样=),因为这样的第三方框架可以连接?)。我使用我的UserBean和EJB实现登录(我的文章中的第3点),并且我只附加了一个过滤器(第5点)。我应该在哪里检查这些框架?我将把web.xml附加到我的帖子中