使用 HTTPServletRequestWrapper 包装请求参数

use*_*898 5 java servlets wrapper servlet-filters tomcat7

我有一个可以验证/授权 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的过滤器 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);
Run Code Online (Sandbox Code Playgroud)

但我收到以下警告

警告:对 URI 的 servlet 请求在请求正文中包含表单参数,但请求正文已被访问请求参数的 servlet 或 servlet 过滤器使用。只有使用 @FormParam 的资源方法才能按预期工作。通过其他方式消耗请求正文的资源方法将无法按预期工作。

我正在 Tomcat 中部署它。帮助!

str*_*y05 5

我想您正在使用 Jersey 作为您的 REST 框架?

我认为这基本上是说,由于 Servlet 现在已经构造了 Request 对象,Jersey 现在无法区分表单参数和查询字符串参数之间的区别。

有关一些详细信息,请参阅此:https ://issues.apache.org/jira/browse/STANBOL-437

这就引出了一个问题 - 这实际上会给您带来问题还是您只是担心警告消息?