如何忽略回发呼叫的过滤器

Posted

技术标签:

【中文标题】如何忽略回发呼叫的过滤器【英文标题】:How to ignore filter for postback calls 【发布时间】:2013-09-04 19:23:46 【问题描述】:

我有一个需要 id 参数 (GET) 的过滤器。当我在导航链接中添加参数时,这很好用。但是当我停留在同一个站点(例如 ajax 调用)时,过滤器会大喊大叫,因为 id 参数丢失了。

如果请求来自ajax,是否有机会忽略过滤器? 像

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
    if (FacesContext.getCurrentInstance().isPostback()) ...
    ...

?

【问题讨论】:

【参考方案1】:

我找到了一个很好的解决方案

private boolean isAJAXRequest(HttpServletRequest request) 
    boolean check = false;
    String facesRequest = request.getHeader("Faces-Request");
    if (facesRequest != null && facesRequest.equals("partial/ajax")) 
        check = true;
    
    return check; 

在过滤器的开头,添加如下:

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

    if(isAJAXRequest(req))
        System.out.println("IGNORE THIS FILTER, AJAX");
        chain.doFilter(request, response);
        return;
    
    ...

【讨论】:

【参考方案2】:

您必须更清楚地定义功能需求。您目前过于模糊,混淆了几个概念。

您究竟想检查什么?

    这是一个 GET 请求。 这不是 JSF ajax POST 请求。 这不是 POST 请求。

您当前的问题标题“如何忽略回发呼叫的过滤器”涵盖 2 和 3。您当前的问题正文 “需要 id 参数 (GET)”涵盖 1。您自己的答案涵盖 2。

这个真的不清楚。所以,我将展示如何覆盖它们:

    检查是否是 GET 请求:

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

    检查它是否不是 JSF ajax POST 请求:

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

    检查是否不是 POST 请求:

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

它们都完全不同:

    这不仅不包括 POST,还包括例如PUT 和 OPTIONS 请求。 这不排除同步的 JSF POST 请求(例如,没有<f:ajax> 的提交按钮)。 这也排除了所有其他类型的 POST 请求。

三思而后行,最终使用正确的工具完成工作。


另一种方法是在表单操作 URL 中保留当前的 ​​GET 查询字符串(即从根源解决问题,而不是解决问题)。答案在这里:Retaining GET request query string parameters on JSF form submit。

【讨论】:

【参考方案3】:

This workaround 正常工作:

private boolean isAjax(HttpServletRequest request) 
    //Return if current request header is equals to "XMLHttpRequest"
    return "XMLHttpRequest".equals((request).getHeader("X-Requested-With"));

【讨论】:

很遗憾,这个解决方案没有?在底部查看我自己的分析器

以上是关于如何忽略回发呼叫的过滤器的主要内容,如果未能解决你的问题,请参考以下文章

GridView 上的 jQuery 函数在页面回发后停止工作(鼠标悬停,单击)

如何忽略角度过滤器中的属性

怎么从Wireshark过滤出单个VoLTE用户呼叫和媒体流

消息过滤器 (0x80010002) 取消了呼叫,Windows Server 2008 中的任务计划程序

DDP 呼叫拦截

列表框在回发时重复(重复)