1

現在、すべての着信 AJAX 要求の中心点として機能するサーブレットがあります。このサーブレットを AJAXHandlerと呼びましょう。

AJAX リクエストは 1 つの大きなリクエストにまとめることができ、AJAXHandler サーブレットは各リクエストを分離し、それぞれに対して「RequestDispatcher.include」を呼び出します。次に、各サーブレットの応答を 1 つの大きな応答にまとめて、クライアントに送り返します。

サーブレット応答 XML をキャッシュするために使用するフィルターもあります。AJAXDispatcher サーブレットを介してリクエストを受信するサーブレットに適用されるサーブレット フィルターの URL パターンを指定する方法を知りたいです。これは可能ですか?

「/*」のパターンは、AJAXDispatcher サーブレット経由で呼び出されないサーブレットと一致するため、使用できません。

編集 - フィルターは応答をキャッシュするために使用されます。最終的に AJAXHandler 自体によって返されるバンドルされた応答ではなく、 AJAXHandlerが転送する個々のサーブレットの応答をキャッシュする必要があります。

4

2 に答える 2

1

これを行う簡単な方法は、サーブレットでリクエスト属性を設定し、フィルターで返されるときにそれを確認することです。

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
    }

}

フィルターは all にマップできます/*

明らかに、このユースケースに固有の属性キーを使用してください。

于 2013-08-16T15:00:22.527 に答える
0

フィルタは、 経由で転送または含まれた一致リクエストのみに適用できますRequestDispatcher。これはDispatcherType列挙型に対応し、 ServletRequest.getDispatcherType(). デフォルトでは、フィルターは のみに一致REQUESTします。これは、クライアントからアプリケーションへの元の要求に使用されるディスパッチャー タイプです。

フィルターに入ると、さまざまなRequestDispatcher.INCLUDE_*属性を使用して、含まれているサーブレットに関する情報を取得できます。AJAXHandlerこれにより、がソースの場合にのみフィルターをさらに適用できるようになります。

web.xml

<dispatcher>内に要素を含めます<filter-mapping>

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

フィルター登録

FilterRegistration.addMappingForServletNames(...)FilterRegistration.addMappingForUrlPatterns(...)どちらもEnumSet<DispatcherType>最初のパラメータとしてanを取ります。

final FilterRegistration registration = servletContext.addFilter(...);
registration.addMappingForUrlPatterns(
    EnumSet.of(DispatcherType.INCLUDE), true, "/*");
于 2015-04-22T17:59:50.440 に答える