2013-05-31 34 views
4

我有一个过滤器来验证/授权REST调用。这个过滤器需要访问请求参数,所以我为此写了一个自定义的HTTPServletRequestWrapper。使用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); 

但我得到下面的警告

警告:servlet请求,到URI ,包含窗体在 参数请求主体,但请求主体已被消费 由servlet或访问请求参数的servlet过滤器消耗。 只有使用@FormParam的资源方法才能按预期工作。资源 通过其他方式使用请求主体的方法将不会像预期的 那样工作。

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

回答

4

我认为你使用Jersey作为你的REST框架?

我想这基本上是说,由于Servlet已经构建了Request对象,泽西现在不能告诉窗体参数和查询字符串参数之间的区别。

的一些细节请参见本:https://issues.apache.org/jira/browse/STANBOL-437

这引出了一个问题 - 就是这实际上造成您的问题还是你只是担心警告信息吗?

+0

是的,谢谢!这里没有问题。这只是一个警告。 – user2289898

2

没错。所以我一直在忍受这个问题,我一直试图以不同的方式解决它,但我不想改变我的web.xml设置,仅仅因为如果我用Postman测试我的应用程序,它的工作是完美的,但是当它被用在Web应用程序集成失败并作为@clijk提到提到的问题(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.

所以,你只需要设置你的标题为:

"Content-Type": "application/json" 
"charset": "UTF-8" 

,瞧,警告它的消失。

谢谢