Как использовать сервлет, просачиваются Java для изменения входящего 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 спасибо!

179
задан Java_User 29 June 2014 в 06:27
поделиться

2 ответа

  1. Реализуйте javax.servlet.Filter .
  2. В методе doFilter () приведите входящий ServletRequest к HttpServletRequest .
  3. Используйте HttpServletRequest # getRequestURI () , чтобы получить путь.
  4. Используйте простые методы java.lang.String , такие как substring () , split () , concat () и т. Д. чтобы извлечь интересующую часть и составить новый путь.
  5. Используйте либо ServletRequest # getRequestDispatcher () , а затем RequestDispatcher # forward () , чтобы перенаправить запрос / ответ на новый URL-адрес (перенаправление на стороне сервера, не отраженное в адресе браузера bar), или приведут входящий ServletResponse к HttpServletResponse , а затем HttpServletResponse # sendRedirect () , чтобы перенаправить ответ на новый URL-адрес ( перенаправление на стороне клиента, отображаемое в адресной строке браузера).
  6. Зарегистрируйте фильтр в сети .xml в шаблоне URL из / * или / Check_License / * , в зависимости от пути контекста или если вы используете Servlet 3.0 уже используйте для этого аннотацию @WebFilter .

Не забудьте добавить проверку в код, если URL требует изменения , и если не , то просто вызовите FilterChain # doFilter () , иначе он будет вызывать себя в бесконечном цикле.

В качестве альтернативы вы также можете просто использовать существующий сторонний API, который сделает всю работу за вас, например UrlRewriteFilter Tuckey, который можно настроить так же, как и с mod_rewrite Apache. ].

272
ответ дан 23 November 2019 в 20:12
поделиться

Вы можете использовать готовый к использованию фильтр перезаписи 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>

Проверьте Примеры для получения дополнительных ... примеров.

21
ответ дан 23 November 2019 в 20:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: