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