サーブレット フィルターを使用して受信 URL を変更/書き換えるにはどうすればよいでしょうか? 質問する

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

ベストアンサー1

  1. 伸ばすjakarta.servlet.http.HttpFilter
  2. doFilter()方法、使用HttpServletRequest#getRequestURI()道を掴むために。
  3. 率直にjava.lang.String次のような方法substring()split()concat()関心のある部分を抽出し、新しいパスを構成します。
  4. どちらかを使用するServletRequest#getRequestDispatcher()その後RequestDispatcher#forward()リクエスト/レスポンスを新しいURLに転送する(サーバー側リダイレクト、ブラウザのアドレスバーには反映されない)、または使用HttpServletResponse#sendRedirect()応答を新しい URL にリダイレクトします (クライアント側のリダイレクト、ブラウザのアドレス バーに反映されます)。
  5. フィルターを登録するには、@WebFilterコンテキスト パスに応じて、url-patternまたは の/*注釈。/Check_License/*

URLがニーズ変更される場合ない、電話するだけFilterChain#doFilter()そうしないと、無限ループで自分自身を呼び出します。

あるいは、既存のサードパーティAPIを使用してすべての作業を行うこともできます。たとえば、タッキーの UrlRewriteFilterこれは、Apache の場合と同じように設定できますmod_rewrite

おすすめ記事