为啥JSF点击xhtml页面3次

Posted

技术标签:

【中文标题】为啥JSF点击xhtml页面3次【英文标题】:Why does JSF hit xhtml page 3 times为什么JSF点击xhtml页面3次 【发布时间】:2015-06-21 04:11:10 【问题描述】:

我有一个 JSF 应用程序。在到达入口点时。

/MyApp/start.xhtml 

该页面包含一个查看操作,该操作将根据查询字符串参数决定要转到哪个页面。

<f:viewAction action="#startController.newQuote()" />

.

@ManagedBean
@SessionScoped
public class StartController 
public String newQuote()
    ....
    FacesContext fc = FacesContext.getCurrentInstance();
    ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)fc.getApplication().getNavigationHandler();
    nav.performNavigation("aboutYou.xhtml?faces-redirect=true");

据我的过滤器,aboutYou.xhtml 被点击了 3 次。

@WebFilter("*.xhtml")
public class TrackingFilter implements Filter 

    private static Logger LOG = Logger.getLogger(TrackingFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException     

        HttpServletRequest req = (HttpServletRequest) request;

        LOG.trace("request URI: " + req.getRequestURI());

这是为什么?我怀疑这与?faces-redirect=true 使用的 PRG 模式有关,但我可能希望看到 2 次,而不是 3 次。

如何优化我的过滤器,以便只捕捉到移动到该页面的单个操作?

【问题讨论】:

您处理导航的方式不必要地笨拙(这里没有 POST 请求,它可以像命令按钮操作一样返回字符串结果),但它不应该导致 3目标页面上的请求。为了排除一个和另一个,浏览器的内置 HTTP 流量监视器到底说了什么? (不要忘记将其设置为保留登录重定向) Firebug 的控制台打开持久化显示 x2 HTTP200 POSTs 笨拙是什么意思?你能建议一种更简洁的方法来拥有一个处理条目并根据 queryString 参数重定向到页面的入站链接 【参考方案1】:

根据评论:

浏览器显示 x2 个 HTTP200 POST

这就是完全预期的 1 个 GET 请求。如果您在加载请求的页面时触发一些 ajax 请求,则可能会发生这些 POST 请求。例如,假设 PrimeFaces,&lt;p:outputPanel deferred="true"&gt;&lt;p:remoteCommand autoRun="true"&gt; 等。通常都与延迟加载有关。

您可以在过滤器中通过检查 HttpServletRequest#getMethod() 来识别 POST 请求。

if ("POST".equals(request.getMethod())) 
    // It's a POST request.

或者,特别是通过检查 Faces-Request 标头的 JSF ajax 请求。

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) 
    // It's a JSF ajax request.


与具体问题无关,您根本没有在这里执行 PRG。默认情况下,&lt;f:viewAction&gt; 仅在 GET 请求上调用,而不是在 POST 请求上调用(仅当您添加 onPostback="true" 时才会这样做)。而且,&lt;f:viewAction action&gt; 的行为与&lt;h:commandButton action&gt; 完全相同,包括像往常一样返回导航案例结果(唯一的区别是它是 GET,而不是 POST)。因此,所有导航处理程序和重定向混乱都是不必要的。

public String newQuote() 
    // ...

    return "aboutYou.xhtml";

仅当不支持返回 String 结果时才需要导航处理程序方法(如在 &lt;f:event type="preRenderView"&gt; 中)。仅当初始请求是 POST 请求时才需要重定向(例如在 &lt;h:commandButton action&gt;&lt;f:viewAction onPostback="true"&gt; 中)。

【讨论】:

你是对的。我有一个 primefaces 。删除它只会导致 2 次命中。我现在将尝试您的其他建议。非常感谢。

以上是关于为啥JSF点击xhtml页面3次的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面?

JSF .xhtml 页面中的 Google 地址自动完成功能 - 任何示例? [复制]

当用户在 JSF 中注销后单击后退按钮时重定向到登录页面 [重复]

如何在 JSF 页面中插入不间断空格字符?

在新选项卡/窗口中打开链接而不丢失当前 JSF 页面的视图范围

JSF 2.0在bean(或页面?)之间传递数据