我有一个验证/授权REST调用的过滤器。这个过滤器需要访问请求参数,所以我为此编写了一个自定义的HTTPServletRequestWrapper。
import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class WrapperRequest extends HttpServletRequestWrapper {
private Map<String, String[]> requestParams = null;
public WrapperRequest(final ServletRequest request) {
super((HttpServletRequest) request);
}
@Override
public String getParameter(final String name) {
if (getParameterMap().get(name) != null) {
return getParameterMap().get(name)[0];
} else {
getParameterMap().get(name)[0] = super.getParameter(name);
requestParams.put(name, getParameterMap().get(name));
return requestParams.get(name)[0];
}
}
@Override
public Map<String, String[]> getParameterMap() {
if (requestParams == null) {
requestParams = new HashMap<String, String[]>();
requestParams.putAll(super.getParameterMap());
}
return Collections.unmodifiableMap(requestParams);
}
@Override
public Enumeration<String> getParameterNames() {
return Collections.enumeration(getParameterMap().keySet());
}
@Override
public String[] getParameterValues(final String name) {
return getParameterMap().get(name);
}
}
在我的过滤器doFilter方法中:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
final WrapperRequest wrappedRequest = new WrapperRequest(request);
Map<String, String[]> paramMap = wrappedRequest.getParameterMap();
chain.doFilter(wrappedRequest, response);
但我收到以下警告
警告:对URI的servlet请求 ,包含形式 请求正文中的参数但已消耗了请求正文 由servlet或servlet过滤器访问请求参数。 只有使用@FormParam的资源方法才能按预期工作。资源 通过其他方式使用请求体的方法将不起作用 预期
我正在Tomcat中部署它。救命啊!
答案 0 :(得分:4)
我认为你使用Jersey作为你的REST框架?
我认为这基本上是说由于Servlet现在构建了Request对象,所以Jersey现在无法分辨表单参数和查询字符串参数之间的区别。
有关详细信息,请参阅此处:https://issues.apache.org/jira/browse/STANBOL-437
这引出了一个问题 - 这实际上是导致您遇到问题还是只是担心警告信息?
答案 1 :(得分:2)
右。所以我一直在遭遇这个问题,我一直试图以不同的方式解决它,但我不想改变我的web.xml设置,只是因为如果我用Postman测试我的应用程序它工作得很完美,但是当它与webapp集成时,它会因上述问题(A servlet request to the URI {MY_URI} contains form parameters in the request body but the request body has been consumed by the servlet or a servlet filter accessing the request parameters. Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
)
提到@clijk时,您只需将标题设置为:
"Content-Type": "application/json"
"charset": "UTF-8"
和voilá,警告已经消失了。
由于