web-dev-qa-db-ja.com

Javaでサーブレットフィルターを使用して、着信サーブレットリクエストURLを変更する方法

サーブレットフィルターを使用して受信サーブレットリクエストURLを変更するにはどうすればよいですか

http://nm-Java.appspot.com/Check_License/Dir_My_App/Dir_ABC/My_Obj_123

http://nm-Java.appspot.com/Check_License?Contact_Id=My_Obj_123


更新:以下のBalusCの手順に従って、私は次のコードを思いつきました:

public class UrlRewriteFilter implements Filter {

    @Override
    public void init(FilterConfig config) throws ServletException {
        //
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest request = (HttpServletRequest) req;
        String requestURI = request.getRequestURI();

        if (requestURI.startsWith("/Check_License/Dir_My_App/")) {
            String toReplace = requestURI.substring(requestURI.indexOf("/Dir_My_App"), requestURI.lastIndexOf("/") + 1);
            String newURI = requestURI.replace(toReplace, "?Contact_Id=");
            req.getRequestDispatcher(newURI).forward(req, res);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
        //
    }
}

web.xmlの関連エントリは次のようになります。

<filter>
    <filter-name>urlRewriteFilter</filter-name>
    <filter-class>com.example.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>urlRewriteFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

サーバー側とクライアント側の両方のリダイレクトを試みて、期待した結果を得ました。 BalusCに感謝します!

175
Frank
  1. javax.servlet.Filter を実装します。
  2. doFilter() メソッドで、着信 ServletRequestHttpServletRequest にキャストします。
  3. HttpServletRequest#getRequestURI() を使用してパスを取得します。
  4. substring()split()concat() のような単純な Java.lang.String メソッドを使用する興味のある部分を抽出し、新しいパスを作成します。
  5. ServletRequest#getRequestDispatcher() を使用してから RequestDispatcher#forward() を使用して、要求/応答を新しいURLに転送します(ブラウザー側のアドレスバーに反映されないサーバー側リダイレクト)。 or着信 ServletResponseHttpServletResponse にキャストしてから HttpServletResponse#sendRedirect() を使用して、応答を新しいURLにリダイレクトします(ブラウザ側のアドレスバーに反映されるクライアント側のリダイレクト)。
  6. コンテキストパスに応じて、web.xmlまたはurl-pattern/*/Check_License/*にフィルターを登録します。または、サーブレット3.0をすでに使用している場合は、代わりに @WebFilter 注釈を使用します。

URLを変更する場合はコードにチェックを追加することを忘れないでくださいneedsを変更する場合、およびnotの場合は、 FilterChain#doFilter() を呼び出すだけですそれ以外の場合は、無限ループで自分自身を呼び出します。

または、Apacheのmod_rewriteで行うように構成できる TuckeyのUrlRewriteFilter など、既存のサードパーティAPIを使用してすべての作業を実行することもできます。

265
BalusC

次のようなルールで、すぐに使用できる rl Rewrite Filter を使用できます。

<rule>
  <from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
  <to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>

その他の例については、 を確認してください。

20
Pascal Thivent

BalusCの答え のステップに基づいた単純なJSF Url Prettyfierフィルター。このフィルターは、/ uiパスで始まるすべての要求を(すべてのxhtmlファイルが保存されていると仮定して)同じパスに転送しますが、xhtmlサフィックスを追加します。

public class UrlPrettyfierFilter implements Filter {

    private static final String JSF_VIEW_ROOT_PATH = "/ui";

    private static final String JSF_VIEW_SUFFIX = ".xhtml";

    @Override
    public void destroy() {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest httpServletRequest = ((HttpServletRequest) request);
        String requestURI = httpServletRequest.getRequestURI();
        //Only process the paths starting with /ui, so as other requests get unprocessed. 
        //You can register the filter itself for /ui/* only, too
        if (requestURI.startsWith(JSF_VIEW_ROOT_PATH) 
                && !requestURI.contains(JSF_VIEW_SUFFIX)) {
            request.getRequestDispatcher(requestURI.concat(JSF_VIEW_SUFFIX))
                .forward(request,response);
        } else {
            chain.doFilter(httpServletRequest, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {

    }

}
5
Xtreme Biker