【问题标题】:Modifying the PathParam of URI in Filter修改Filter中URI的PathParam
【发布时间】:2020-02-22 14:10:29
【问题描述】:

我需要修改 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); 

仍然没有运气,因为它仅调用值为 32 的 API,即仅以前的值。请指导我解决此问题。

期望传入的请求 URI 应该在新的 URI 请求中得到修改,并且应该调用相应的 API。

【问题讨论】:

    标签: java spring filter


    【解决方案1】:

    通过删除 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 Question 以供参考。

    【讨论】:

    • 我也试过了,但没有运气。低于指定的错误。似乎根本没有发送请求。 {“时间戳”:“2019-10-28T09:07:58.169+0000”,“状态”:404,“错误”:“未找到”,“消息”:“没有可用消息”,“路径”:“/ api/stories/27/cmets/32" }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2017-08-22
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多