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

时间:2019-12-04 19:37:05

标签: java spring-boot servlet-filters

对此有一些技巧,但是他们的解决方案不能解决我的问题。 我有一个类似这样的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中。但是我一直都得到原始的价值。

1 个答案:

答案 0 :(得分: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);

所有有关拦截的信息。