使用HTTPServletRequestWrapper包装请求参数 [英] Wrapping request parameters using HTTPServletRequestWrapper

查看:266
本文介绍了使用HTTPServletRequestWrapper包装请求参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个验证/授权REST调用的过滤器。此过滤器需要访问请求参数,因此我为此编写了自定义HTTPServletRequestWrapper。

I have a filter that authenticates/authorizes REST calls. This filters needs to access the request parameters so I have written a custom HTTPServletRequestWrapper for this.

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方法中:

In my filter doFilter method:

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的资源方法才能按预期工作。通过其他方式使用请求正文的资源
方法将无法用作
预期。

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。帮助!

I am deploying this in Tomcat. Help!

推荐答案

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

I take it you are using Jersey for your REST framework?

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

I think this is basically saying that since the Servlet has now constructed the Request object, Jersey now cant tell the difference between form parameters and query string params.

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

See this for some details: https://issues.apache.org/jira/browse/STANBOL-437

这引出了一个问题 - 这实际上是导致您遇到问题还是你只是担心警告信息?

This begs the question - is this actually causing you an issue or are you just worried about the warning message?

这篇关于使用HTTPServletRequestWrapper包装请求参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆