サーブレットフィルターを使用して受信サーブレットリクエスト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()
を使用してパスを取得します。substring()
、 split()
、 concat()
のような単純な Java.lang.String
メソッドを使用する興味のある部分を抽出し、新しいパスを作成します。ServletRequest#getRequestDispatcher()
を使用してから RequestDispatcher#forward()
を使用して、要求/応答を新しいURLに転送します(ブラウザー側のアドレスバーに反映されないサーバー側リダイレクト)。 or着信 ServletResponse
を HttpServletResponse
にキャストしてから HttpServletResponse#sendRedirect()
を使用して、応答を新しいURLにリダイレクトします(ブラウザ側のアドレスバーに反映されるクライアント側のリダイレクト)。web.xml
またはurl-pattern
の/*
の/Check_License/*
にフィルターを登録します。または、サーブレット3.0をすでに使用している場合は、代わりに @WebFilter
注釈を使用します。URLを変更する場合はコードにチェックを追加することを忘れないでくださいneedsを変更する場合、およびnotの場合は、 FilterChain#doFilter()
を呼び出すだけですそれ以外の場合は、無限ループで自分自身を呼び出します。
または、Apacheのmod_rewrite
で行うように構成できる TuckeyのUrlRewriteFilter など、既存のサードパーティAPIを使用してすべての作業を実行することもできます。
次のようなルールで、すぐに使用できる 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>
その他の例については、 例 を確認してください。
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 {
}
}