【问题标题】:faces-redirect and the back button cause other links to work incorrectlyfaces-redirect 和后退按钮导致其他链接无法正常工作
【发布时间】:2011-12-11 22:34:09
【问题描述】:

我有一个关于面孔导航的问题。

所以我有一个页面,它采用请求参数来加载特定用户。此页面显示一个 commandLink 列表,单击该列表时,会使用隐式导航重定向到另一个页面。通过调用“preRenderView”中的方法加载用户。

我们重定向到的页面也需要一个请求参数来确定要加载哪个案例。该页面也使用了 preRenderView。

两个页面都有视图范围的 bean。

对于按下的第一个链接,这一切都很棒。第一个页面重定向到新 URL,并且案例按预期加载。

但是,如果我单击浏览器的后退按钮,然后单击另一个链接,则页面不会重定向。它会刷新(而不是),并且显然不会购买这种情况。

刷新后,我可以点击一个链接,它会正确重定向。

现在,当第一页的 bean 保存在会话中时,所有这些都可以正常工作,但我不想滥用会话状态,我认为我不应该要求我将这些数据保存在会话。

我知道我可以通过在单击后退按钮时自动重新加载页面来解决此问题(因为将重新创建视图),但我也不确定这是否是正确的解决方案。 (我也不知道我会如何强迫它)

有人有什么建议吗?这似乎是一个相当常见的用例,但我真的找不到任何示例。

谢谢!

【问题讨论】:

    标签: jsf redirect jsf-2


    【解决方案1】:

    基本上,您需要告诉浏览器不要缓存动态生成的 JSF 页面,同时将视图状态保存方法设置为(默认)server。视图状态由 <input type="hidden" name="javax.faces.ViewState"> 字段以生成的 JSF 页面的形式跟踪,其中视图状态标识符作为输入值。当您提交页面并导航到不同的页面时,视图状态在服务器端被丢弃并且不再存在。从浏览器缓存中取回页面仍然会为您提供旧的视图状态标识符作为隐藏输入的值。提交该表单根本不起作用,因为在服务器端找不到任何视图状态。

    您希望直接从服务器而不是从浏览器缓存中获取新页面。为了告诉浏览器这样做,请像这样创建一个Filter

    @WebFilter(servletNames={"Faces Servlet"})
    public class NoCacheFilter implements Filter {
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest httpReq = (HttpServletRequest) request;
            HttpServletResponse httpRes = (HttpServletResponse) response;
    
            if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
                httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
                httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0.
                httpRes.setDateHeader("Expires", 0); // Proxies.
            }
    
            chain.doFilter(request, response);
        }
    
        // ...
    }
    

    这样,后退按钮将发送一个完整的 HTTP 请求,该请求应该重新创建视图状态并生成一个带有正确视图状态隐藏字段值的表单的页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多