2013-09-01 30 views
3

我有一個過濾器需要一個id參數(GET)。當我在導航鏈接中添加參數時,這工作正常。但是,當我留在同一個站點(例如ajax調用)時,過濾器發出尖叫聲,因爲id參數丟失。如何忽略過濾器回發呼叫

如果請求來自ajax,是否有機會忽略過濾器? 類似於

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

回答

2

我發現它在過濾器的開始工作正常

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; 
    } 
    ... 
} 
0

This workaround只是工作:

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

不幸的是,這個解決方案不?在底部看到我自己的anser – Niko

1

你有更清楚地定義功能要求。你目前太模糊,混合了幾個概念。

你究竟想檢查什麼?

  1. 這是一個GET請求。
  2. 它不是JSF ajax POST請求。
  3. 這不是一個POST請求。

您當前的問題的標題「如何忽略回傳過濾器稱爲」佔地面積2和3。您當前問題的身體「這需要一個ID參數(GET)」涵蓋1.你自己的答案蓋2.

這真的不清楚。所以,我就展示如何掩蓋他們每個人:

  1. 要檢查它是否是一個GET請求:

    if ("GET".equals(request.getMethod())) { 
        // It's a GET request. 
    } 
    
  2. 要檢查,如果它不是一個JSF AJAX POST請求:

    if (!"partial/ajax".equals(request.getHeader("Faces-Request"))) { 
        // It's not a JSF ajax request. 
    } 
    
  3. 要檢查,如果它不是一個POST請求:

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

他們都是很大的不同:

  1. 這不僅排除了POST,但也如PUT和OPTIONS請求。
  2. 這並不排除同步JSF POST請求(例如,提交按鈕不帶<f:ajax>)。
  3. 這也排除了所有其他類型的POST請求。

重新思考,最終只是使用正確的工具來完成這項工作。


另一種方法是保留的形式動作URL當前GET查詢字符串(即,通過其根源解決問題workarounding它代替)。這裏回答了這個問題:Retaining GET request query string parameters on JSF form submit