在Spring Boot应用程序中使用Filter修改ServletRequest

问题描述 投票:0回答:1

[这有一些小武器,但他们的解决方案无法解决我的问题。我有一个类似这样的GET请求:localhost:8080/rest/users/search?name=john&age=20&count=20

我的要求是,当请求包含“ count”个查询参数时,我想检查该值是否不大于10。如果大于10,则将查询参数替换为“ count = 10”。

为了解决这个问题,我尝试使用javax.servlet.Filterjavax.servlet.http.HttpServletRequestWrapper,但无法替换请求中的原始值。

这是我的WebFilter的外观:

@Component
public class WebFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) {
        logger.debug("Initiating WebFilter >> ");
    }

    @Override
    public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
            throws IOException, ServletException {

            final HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) request);
            if (requestWrapper.getParameterValues("count") != null) {
                String[] count = requestWrapper.getParameterValues("price");

                for (int i = 0; i < count.length; i++) {
                    if (Integer.parseInt(count[i]) > 10) {
                        count[i] = "10";
                    }
                }
                requestWrapper.setAttribute("count", count);
            }

            System.out.println("count: " + requestWrapper.getParameter("count"));

            // Goes to default servlet
            chain.doFilter(requestWrapper, response);
    }

    @Override
    public void destroy() {
        logger.debug("Destroying WebFilter >> ");
    }
}

[我在其他文章中看到,仅通过执行requestWrapper.setAttribute("count", count);就会将新值添加到responseWrapper。但是我一直都得到原始的价值。

java spring-boot servlet-filters
1个回答
0
投票

您无法设置查询参数-从API角度来看,它是不可变的。您需要做的就是扩展请求包装器并重写getParameter()方法,以返回要提供给定查询名称时要返回的值。所以像这样(膝盖在记事本中编程)

class YourWrapper{
  ...ctors etc
   @Override
   public String[] getParamter(String name){
         if(name.equals("count"){
             String[] original super.getParameter(name); // get original values, process it and 
             return ...// either original val or String.valueOf(10);
          }
         return super.getParameter(name);
    }

}

比您包装请求并通过过滤链

chain.doFilter(new YourWrapper(request),response);

因此,所有关于拦截的事情。

© www.soinside.com 2019 - 2024. All rights reserved.