2013-08-16 52 views
1

我目前有一個servlet充當所有傳入AJAX請求的中心點。我們稱這個servlet爲AJAXHandlerServlet過濾器URL模式 - 如何匹配特定servlet發送請求的所有servlet

AJAX請求可以綁定到一個大請求中,然後AJAXHandler servlet分離每個請求併爲每個請求調用「RequestDispatcher.include」。然後它將每個servlet的響應綁定到一個大的響應中,並將其發送回客戶端。

我也有一個過濾器,用於緩存servlet響應XML。我想知道如何指定一個servlet過濾器的URL模式,它適用於任何通過AJAXDispatcher servlet接收請求的servlet。這可能嗎?

我無法使用'/ *'模式,因爲這樣會匹配不通過AJAXDispatcher servlet調用的servlet。

編輯 - 該過濾器用於緩存響應。我需要緩存AJAXHandler轉發的單個servlet的響應,最終由AJAXHandler本身返回的綁定響應。

+0

你想檢測該請求來自AJAX嗎? –

+0

不確定,但是servlet過濾器呢? –

+0

您在內部是否在servlet之間轉發請求? –

回答

1

一個足夠簡單的方法是在Servlet中設置請求屬性,並在Filter中返回時檢查它。

public class AjaxHandler extends HttpServlet { 
    public void doGet(HttpServletRequest req, HttpServletResponse resp) { 
     req.setAttribute("cache", "true"); 
     ... 
    } 
} 

Filter

@Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    chain.doFilter(request, response) 
    if (request.getAttribute("cache") != null) { 
     // do your thing 
    } 

} 

您的過濾器可以被映射到所有/*

很顯然,使用這個用例唯一的屬性鍵。

0

過濾器只能用於匹配通過RequestDispatcher轉發或包含的請求。這對應於枚舉DispatcherTypeServletRequest.getDispatcherType()。默認情況下,過濾器只匹配REQUEST,這是來自客戶端的原始請求用於應用程序的調度程序類型。

一旦進入過濾器,您可以使用各種RequestDispatcher.INCLUDE_*屬性來檢索有關包含servlet的信息。這應該允許你進一步只應用過濾器,當AJAXHandler是源。

的web.xml

附上<filter-mapping><dispatcher>內的元件。

<filter-mapping> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>INCLUDED</dispatcher> 
</filter-mapping> 

FilterRegistration

FilterRegistration.addMappingForServletNames(...)FilterRegistration.addMappingForUrlPatterns(...)既採取EnumSet<DispatcherType>作爲第一個參數。

final FilterRegistration registration = servletContext.addFilter(...); 
registration.addMappingForUrlPatterns(
    EnumSet.of(DispatcherType.INCLUDE), true, "/*");