Изменение PathParam URI в фильтре - PullRequest
1 голос
/ 26 октября 2019

Мне нужно изменить путь URI Переменная. т. е. всякий раз, когда я получаю запрос на "/api/stories/27/comments/32", он должен преобразовываться в "/api/stories/27/comments/323322X"

. Я использовал фильтры для изменения URI запроса, используя указанные ниже методы:

@Component
public class HashIDFilter implements Filter {
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        if (request.getRequestURL().toString().contains("/comments/")) {
            HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {
                @Override
                public String getRequestURI() {
                    System.out.println("orig url:" + request.getRequestURL().toString());
                    String arr[] = request.getRequestURL().toString().split("/comments/");
                    String url = arr[0] + "/comments/" + "3442424/";// HashIdSimple.decode(arr[1]);
                    System.out.println("url:" + url);
                    return url;
                }
            };
request.getRequestDispatcher(requestWrapper.getRequestURI()).forward(request, response);
        } else {
            System.out.println("req");
            chain.doFilter(req, res);
        }
    }
}

Ниже указанногосообщается об ошибке:

{
    "timestamp": "2019-10-26T14:32:19.932+0000",
    "status": 404,
    "error": "Not Found",
    "message": "No message available",
    "path": "/api/stories/27/comments/32"
}

Вместо RequestDispatcher я попытался с

chain.doFilter(requestWrapper, response); 

Все еще не повезло, так как он вызывает API со значением только 32 т.е. только предыдущее значение. Пожалуйста, помогите мне решить эту проблему.

Ожидается, что URI входящего запроса должен быть изменен в новом запросе URI, и должен быть вызван соответствующий API.

1 Ответ

0 голосов
/ 26 октября 2019

Обновите код для этого, удалив HttpServletRequestWrapper:

    @Component
    public class HashIDFilter implements Filter {
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
                throws IOException, ServletException {

            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) res;
            if (request.getRequestURL().toString().contains("/comments/")) {  
               String arr[] = request.getRequestURL().toString().split("/comments/");
               String url = arr[0] + "/comments/" + "3442424/";
               request.getRequestDispatcher(url).forward(request, response);
            } else {
                chain.doFilter(req, res);
            }
        }
    }

Добавить фильтр в web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" 
         xmlns="http://java.sun.com/xml/ns/j2ee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
         http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <filter>
        <filter-name>hashIdFilter</filter-name>
        <filter-class>package.HashIDFilter</filter-class>
    </filter>
    <filter-mapping>
           <filter-name>hashIdFilter</filter-name>
           <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

См. Этот популярный SOВопрос для справки.

...