如何忽略回发呼叫的过滤器
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用户呼叫和媒体流