Как я могу использовать фильтр сервлета для изменения входящего 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-адрес (перенаправление на стороне сервера, не отраженное в адресе браузера bar), или приведут входящий ServletResponse
к HttpServletResponse
, а затем HttpServletResponse # sendRedirect ()
, чтобы перенаправить ответ на новый URL-адрес ( перенаправление на стороне клиента, отображаемое в адресной строке браузера). .xml
в шаблоне URL
из / *
или / Check_License / *
, в зависимости от пути контекста или если вы используете Servlet 3.0 уже используйте для этого аннотацию @WebFilter
. Не забудьте добавить проверку в код, если URL требует изменения , и если не , то просто вызовите FilterChain # doFilter ()
, иначе он будет вызывать себя в бесконечном цикле.
В качестве альтернативы вы также можете просто использовать существующий сторонний API, который сделает всю работу за вас, например UrlRewriteFilter Tuckey, который можно настроить так же, как и с mod_rewrite
Apache. ].
Вы можете использовать готовый к использованию фильтр перезаписи URL со следующим правилом:
<rule>
<from>^/Check_License/Dir_My_App/Dir_ABC/My_Obj_([0-9]+)$</from>
<to>/Check_License?Contact_Id=My_Obj_$1</to>
</rule>
Проверьте Примеры для получения дополнительных ... примеров.