【问题标题】:Browser back button doesn't clear old backing bean values浏览器后退按钮不会清除旧的支持 bean 值
【发布时间】:2011-09-15 21:09:14
【问题描述】:

我们使用 JSF2,我们有一个带有链接到支持 bean 的命令按钮的表单字段的页面。

当我们访问表单页面,输入值并提交时,支持 bean 接收到正确的值并将其带到下一页。如果我在浏览器中按下后退按钮,它会转到带有表单的上一页。如果我在表单中输入新值并提交,支持 bean 仍会在步骤 1 中接收旧值。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    这很奇怪。也许您的 bean 被放入会话范围和/或浏览器已从缓存中请求页面。首先,您想通过设置正确响应标头的filter 禁用所有动态页面的浏览器缓存。

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

    将此过滤器映射到 FacesServlet 的 servlet 名称或相同的 URL 模式。

    最后但同样重要的是,不要将表单 bean 放在会话范围内。将它们放在请求或视图范围内。

    【讨论】:

    • 我今天发现 GlassFish 3.1.1 与 ViewScope bean 相同。当我第二次返回并按下提交按钮时,按钮 未执行操作 并且浏览器 (FireFox) 显示具有先前结果的视图。按钮代码是<h:commandButton value="Submit" action="#{search.commit}" />。搜索表单和结果数据表位于同一个视图 xhtml 文件中(但包含为 facelets)。我会试着分析一下。
    • 它在 Internet Explorer 中的工作方式有所不同 - 返回搜索表单会清除所有输入值,因此我需要再次填写表单并按预期提交作品。
    【解决方案2】:

    仔细学习 JSF,glassfish 中的 JSF2.0 工作得很好,如果你有 viewscoped beans 并按浏览器返回/下一个链接 JSF 仔细加载了上一页,你也可以看到你的数据并提交它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      相关资源
      最近更新 更多