在web浏览器中显示页面之前调用方法



我有一个web应用程序,有两个页面A和B。从页面A,我通过h:commandButton导航到B侧,并从backingbean中生成方法,返回B.xhtml

当我在B页面时,我想通过网络浏览器中的"返回"按钮返回到A页面。在回到A页面之前,我想从backingbean调用方法。

我试着通过来做到这一点

<f:metadata> 
     <f:event type="preRenderView" listener="#{userManager.myMethod}" />
</f:metadata>

但没用。你还知道其他想法吗?

当后退按钮实际上没有击中服务器,而是显示之前从浏览器缓存中获得的页面时,它不会"工作"。这将在没有任何HTTP请求的情况下发生,因此不会调用与生成页面HTML输出相关的任何服务器端代码。

您可以通过指示浏览器不要缓存这些页面来解决此问题,这样它们将始终直接从服务器请求,从而执行与生成页面HTML输出相关的所有服务器端代码,例如preRenderView事件侦听器。

作为一个启动示例,假设您的FacesServletweb.xml中注册在facesServlet:的<servlet-name>上,则此筛选器应该执行此操作

@WebFilter(servletNames = "facesServlet")
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"); // HTTP 1.1.
            response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            response.setDateHeader("Expires", 0); // Proxies.
        }
        chain.doFilter(req, res);
    }
    // init() and destroy() can be kept NOOP.
}

另请参阅:

  • 避免JSF web应用程序上的后退按钮

相关内容

  • 没有找到相关文章

最新更新