【发布时间】:2019-12-04 19:37:05
【问题描述】:
这方面有一些文章,但他们的解决方案并没有解决我的问题。
我有一个看起来像这样的 GET 请求:
localhost:8080/rest/users/search?name=john&age=20&count=20
我的要求是每当请求包含“count”查询参数时,我要检查该值是否不超过10。如果超过10,则将查询参数替换为“count=10”
为了解决这个问题,我尝试使用 javax.servlet.Filter 和 javax.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) 你不需要包装器,因为你没有扩展它——因此它毫无意义。 2)链中的不同过滤器可能正在修改它 3)您的过滤器可能在链中的错误位置(与 2 相关)
-
4) 设置属性不会修改查询参数——它只是将给定属性添加到一个映射中,其他组件可以从同一个请求对象中读取——它是一种数据交换映射。跨度>
标签: java spring-boot servlet-filters