JSF应用程序中的导航历史一致性

时间:2017-08-17 14:05:39

标签: jsf java-ee jsf-2 navigation servlet-filters

我正在开发一个JSF应用程序,我想保留有关导航前后的历史记录一致性。特别是我可以给出这个例子:

有页面overview.xhtml及其支持Bean OverviewBean。它显示了datatable中的项目列表。我在datatable的每一行都有一个链接,该链接指向每个展示项目的item_details.xhtml视图:

<h:column>
        <f:facet name="header">Edit</f:facet>
        <h:link value="Edit" outcome="/item_details">
            <f:param name="itemId" value="#{item.id}" />
        </h:link>
</h:column>

用户可以通过点击导致item_details.xhtml页面的overview.xhtml的提交按钮来编辑项目数据并保存更改。这适用于h:commandButton和相应的操作方法:

<h:commandButton value="Submit" action="#{itemDetailsBean.update()}" /> 

   public String update() {
        itemEjb.updateItem(updatedItem);
        return "overview.xhtml?faces-redirect=true";
    }

用户在overview.xhtml页面上再次按预期进行操作。但是,在这种情况下,浏览器后退按钮会返回item_details.xhtml页面,如果再次再次按下overview.xhtml。换句话说,如果一个人遵循导航路线

overview -> item_details_3 -> overview -> item_details_5 -> overview -> item_details_2 -> overview

有(不希望的)可能以相反的方向返回这条路线。 我的意图是overview.xhtml页面作为root page和该页面上的后退按钮,引导用户退出应用程序或提示注销。换句话说,我希望导航作为堆栈工作:

forward: push(page)
back:    pop(page)

我如何在JSF中实现这一目标? 我知道有类似的帖子,但没有任何对我有用。 我还尝试了NoCacheFilter

@WebFilter("/faces/*")
public class NoCacheFilter implements Filter {


    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        if (!request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc)
           response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
           response.setHeader("Pragma", "no-cache"); 
           response.setDateHeader("Expires", 0);
        }

        chain.doFilter(req, res);
    }

}

虽然调用方法doFilter,但它对导航没有影响。

0 个答案:

没有答案