0

ServletFilterを持つ組み込み Tomcat の単純なインスタンス:

            Tomcat tomcat = new Tomcat();
            Context rootCtx = tomcat.addContext("", base.getAbsolutePath());
            FilterDef filterDefinition = new FilterDef();
            filterDefinition.setFilterName(URLFilter.class.getSimpleName());
            filterDefinition.setFilterClass(URLFilter.class.getName());
            rootCtx.addFilterDef(filterDefinition);

            FilterMap filter1mapping = new FilterMap();
            filter1mapping.setFilterName(URLFilter.class.getSimpleName());
            filter1mapping.addURLPattern("/*");
            rootCtx.addFilterMap(filter1mapping);

            Tomcat.addServlet(rootCtx, "Servlet1", new Servlet1());
            rootCtx.addServletMapping("/Servlet1", "Servlet1");

URLフィルターの実装:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    Boolean filtered = false;
    System.out.println("request intercepted");
    if (request.getAttribute("filtered") != null) {
        filtered = true;
        request.setAttribute("filtered", filtered);
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpResponse.sendRedirect("/Servlet1");
        return;
    } else {
        filterChain.doFilter(request, response);
    }
}

何らかの理由で、これは無限ループに陥り、Servlet1 に到達しません。応答を配信する前に、要求の周りのパラメーターを再確認できるように URL フィルターを実装する正しい方法は何ですか?

4

2 に答える 2

1

sendRedirect()のJavaDocsを見てください。各リクエストでクライアントに/Servlet1 に戻るように指示していますが、それを無期限にフィルタリングしています。ある時点で、フィルタでリダイレクトの送信を停止する必要があります!

もう少し明確にするために。リクエストを積極的にフィルタリングするつもりがない場合は、呼び出すだけです。

filterChain.dofilter(request, response);

本当に HTTP 302 (一時的なリダイレクト) を送信するつもりでない限り、リダイレクトを返さないでください。サーブレット フィルター チェーンはサーブレット プロセスの重要な部分であり、直観に反するように見えるかもしれませんが、filterChain.doFilter コマンドを呼び出して、フィルターが何もしていないように見せることができます。アプリケーション・サーバー。

私には明確ではないのは、フィルターが何をしようとしているのかということです。URL でフィルタリングする場合は、一致する URL を探し、一致する場合にのみリダイレクトする必要があります。

于 2014-03-27T14:54:21.377 に答える
0

これで問題が解決したので、回答として投稿してください。

まず、アプリケーション フィルター チェーンに沿ってリクエストを渡している、リダイレクトしていることを確認する必要があります。

@Override
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain filterChain) throws IOException, ServletException {

    Boolean filtered = false;
    System.out.println("request intercepted");
    if (!filtered) {
        filtered = true;
        ((HttpServletResponse) response).sendRedirect("/Servlet1");
        return;
    }

    filterChain.doFilter(request, response);
}

次に、着信リクエストがいつリダイレクトされたかをフィルターが認識して、再度リダイレクトしないようにする必要があります。

@Override
public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain filterChain) throws IOException, ServletException {

    Boolean filtered = false;
    System.out.println("request intercepted");
    if (request.getAttribute("filtered") != null) {
        filtered = (Boolean) request.getAttribute("filtered");
    }

    if (!filtered) {
        request.setAttribute("filtered", Boolean.TRUE);
        ((HttpServletResponse) response).sendRedirect("/Servlet1");
        return;
    }

    filterChain.doFilter(request, response);
}
于 2014-03-27T15:53:30.747 に答える