java - 使用 HTTPServletRequestWrapper 包装请求参数

标签 java servlets tomcat7 wrapper servlet-filters

我有一个过滤器可以验证/授权 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);

但我收到以下警告

WARNING: A servlet request, to the 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.

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

最佳答案

我认为您正在将 Jersey 用于 REST 框架?

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

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

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

关于java - 使用 HTTPServletRequestWrapper 包装请求参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16848180/

相关文章:

java - 如何从服务器端更新firestore中所有用户的剩余天数?

java - 中午解析 SimpleDateFormat 错误?

java.lang.ClassNotFoundException : com. oreilly.servlet.MultipartRequest

java - 如何在不伤害现有用户的情况下在生产环境中部署 war 文件

apache - 如何检测 503 Service Temporarily Unavailable 错误的原因并进行处理?

java - 如何使用JClouds-Chef指定客户端版本?

Java 8 到 Java 11 : package com. sun.jndi.ldap 不可见

security - HttpSession 安全

servlets - 如何从 web.xml 读取 session 超时

java - 使用 nginx/Tomcat7 和 Java 应用程序保护单个文件