1. ホーム
  2. java

[解決済み] Javaでサーブレットフィルタを使用して、受信したサーブレットリクエストのURLを変更するにはどうすればよいですか?

2022-04-19 05:42:25

質問

サーブレットフィルタを使用して、受信したサーブレットリクエストの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さんありがとうございます。

解決方法は?

  1. 実装 javax.servlet.Filter .
  2. doFilter() メソッドで、入力された ServletRequest から HttpServletRequest .
  3. 使用方法 HttpServletRequest#getRequestURI() でパスを取得します。
  4. ストレートに使う java.lang.String のようなメソッドです。 substring() , split() , concat() といった具合に、興味のある部分を抽出して、新しいパスを構成します。
  5. のどちらかを使用します。 ServletRequest#getRequestDispatcher() で、次に RequestDispatcher#forward() を使用して、リクエスト/レスポンスを新しいURLに転送します (サーバーサイドのリダイレクト、ブラウザのアドレスバーには反映されません)。 または 受信した ServletResponse から HttpServletResponse で、次に HttpServletResponse#sendRedirect() を使用して、レスポンスを新しいURLにリダイレクトします (クライアント側のリダイレクト、ブラウザのアドレスバーに反映されます)。
  6. でフィルタを登録します。 web.xml の上で url-pattern/* または /Check_License/* あるいは、Servlet 3.0 を使っている場合は、 コンテキストパスに応じて @WebFilter アノテーションで代用します。

コード内で、URLの が必要です。 を変更し ない を呼び出すだけです。 FilterChain#doFilter() さもないと、無限ループで自分自身を呼び出すことになります。

あるいは、次のような既存のサードパーティAPIを使用して、すべての作業を代行させることもできます。 タッキーのUrlRewriteFilter これは、Apache の mod_rewrite .