Jsf 当使用org.omnifaces.cdi.viewscope时,我的javax.servlet.Filter在单个页面视图上同时接收GET和POST

Jsf 当使用org.omnifaces.cdi.viewscope时,我的javax.servlet.Filter在单个页面视图上同时接收GET和POST,jsf,omnifaces,Jsf,Omnifaces,我的用于记录页面视图的servletfilter正在接收带有单个页面请求的GET和POST。我追溯到在页面备份bean上使用OmniFacesViewScope @Named @org.omnifaces.cdi.ViewScoped 我碰巧注意到我的日志文件中有两个带有精确时间戳的页面视图。使用下面的简化版本进行调试,在一个页面请求上,doFilter执行两次,第一次是GET,URL是我正在浏览的URL。然后再次执行doFilter,它是一篇文章,URL是我来自的页面。如果我刷新页面,我会看

我的用于记录页面视图的servletfilter正在接收带有单个页面请求的GET和POST。我追溯到在页面备份bean上使用OmniFacesViewScope

@Named
@org.omnifaces.cdi.ViewScoped
我碰巧注意到我的日志文件中有两个带有精确时间戳的页面视图。使用下面的简化版本进行调试,在一个页面请求上,doFilter执行两次,第一次是GET,URL是我正在浏览的URL。然后再次执行doFilter,它是一篇文章,URL是我来自的页面。如果我刷新页面,我会看到一个GET,然后是一篇到同一页面的帖子。如果使用javax.faces.view.ViewScoped,则只有GET请求进入

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    System.out.println(new java.util.Date() + " " + ((HttpServletRequest) request).getMethod() + " " + httpRequest.getServletPath());
    chain.doFilter(request, response);
}
例如,如果我正在查看http://localhost:8080/myApp/page1.xhtml 我将url更改为page2.xhtml

过滤器将写出

Wed Aug 26 12:17:04 EDT 2020 GET /page2.xhtml
Wed Aug 26 12:17:04 EDT 2020 POST /page1.xhtml
也许是故意的?。但是我只想记录用户浏览的页面,而不是他们来自的页面。有这么简单吗

    if(((HttpServletRequest) request).getMethod().equalsIgnoreCase("GET")){
      //Write to actual log file
    }

或者我使用omnifaces viewscope是错误的?

这确实是出于设计。上一页的帖子基本上发送了一个信号,表明页面已经卸载,@ViewScoped后面的逻辑知道它必须立即销毁JSF视图状态和物理bean

另见:

。。。此CDI视图范围注释将保证在浏览器卸载时也调用@PreDestroy注释的方法。此技巧由navigator.sendBeacon完成。对于不支持navigator.sendBeacon的浏览器,它将回退到同步XHR请求

当您想在过滤器中检测它们时,可以使用


无可否认,这确实没有足够清晰的文档记录,我将在下一个版本中记住这一点。

这确实是出于设计。上一页的帖子基本上发送了一个信号,表明页面已经卸载,@ViewScoped后面的逻辑知道它必须立即销毁JSF视图状态和物理bean

另见:

。。。此CDI视图范围注释将保证在浏览器卸载时也调用@PreDestroy注释的方法。此技巧由navigator.sendBeacon完成。对于不支持navigator.sendBeacon的浏览器,它将回退到同步XHR请求

当您想在过滤器中检测它们时,可以使用


诚然,这方面的文档确实不够清晰,我将在下一版本中记住这一点。

谢谢!那么,Omnifaces ViewScope版本在内存方面是否比javax版本更高效,因为它不会在服务器上留下一堆被放弃的视图状态,等待被服务器的非活动超时破坏?没错。另请参阅,谢谢!那么,Omnifaces ViewScope版本在内存方面是否比javax版本更高效,因为它不会在服务器上留下一堆被放弃的视图状态,等待被服务器的非活动超时破坏?没错。另见和
if (!ViewScopeManager.isUnloadRequest(request)) {
    // Write to actual log file.
}

chain.doFilter(request, response); // Ensure that this just continues!