[解決済み] 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さんありがとうございます。
解決方法は?
-
実装
javax.servlet.Filter
. -
で
doFilter()
メソッドで、入力されたServletRequest
からHttpServletRequest
. -
使用方法
HttpServletRequest#getRequestURI()
でパスを取得します。 -
ストレートに使う
java.lang.String
のようなメソッドです。substring()
,split()
,concat()
といった具合に、興味のある部分を抽出して、新しいパスを構成します。 -
のどちらかを使用します。
ServletRequest#getRequestDispatcher()
で、次にRequestDispatcher#forward()
を使用して、リクエスト/レスポンスを新しいURLに転送します (サーバーサイドのリダイレクト、ブラウザのアドレスバーには反映されません)。 または 受信したServletResponse
からHttpServletResponse
で、次にHttpServletResponse#sendRedirect()
を使用して、レスポンスを新しいURLにリダイレクトします (クライアント側のリダイレクト、ブラウザのアドレスバーに反映されます)。 -
でフィルタを登録します。
web.xml
の上でurl-pattern
の/*
または/Check_License/*
あるいは、Servlet 3.0 を使っている場合は、 コンテキストパスに応じて@WebFilter
アノテーションで代用します。
コード内で、URLの
が必要です。
を変更し
ない
を呼び出すだけです。
FilterChain#doFilter()
さもないと、無限ループで自分自身を呼び出すことになります。
あるいは、次のような既存のサードパーティAPIを使用して、すべての作業を代行させることもできます。
タッキーのUrlRewriteFilter
これは、Apache の
mod_rewrite
.
関連
-
jd-gui Java Exceptionが発生しました。
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] HTTP POSTリクエストでは、どのようにパラメータが送信されるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
final, finally, finalizeの違いについて話してください。
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
org.glassfish.jersey.servlet.ServletContainer
-
あるコードに出会いましたが、何に使うのか理解できません。 List<String> list = new ArrayList<String>() { { a
-
java 例外。Javaツールの初期化
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)
-
ローカルリソースのロードが許可されていない場合の解決策