在servlet过滤器中向请求添加HTTP标头

问题描述:

我正在与现有的servlet集成,从而将一些属性从HTTP头中拉出来。基本上,我正在实现一个无法访问实际请求的接口,它只能访问HTTP头的k-> v映射。

I'm integrating with an existing servlet that pulls some properties out of the HTTP header. Basically, I'm implementing an interface that doesn't have access to the actual request, it just has access to a map of k->v for the HTTP headers.

我需要传入一个请求参数。计划是使用servlet过滤器从参数到标头值,但当然HttpServletRequest对象没有addHeader()方法。

I need to pass in a request parameter. The plan is to use a servlet filter to go from parameter to header value but of course the HttpServletRequest object doesn't have an addHeader() method.

任何想法?

扩展 HttpServletRequestWrapper ,覆盖标题getter以返回参数:

Extend HttpServletRequestWrapper, override the header getters to return the parameters as well:

public class AddParamsToHeader extends HttpServletRequestWrapper {
    public AddParamsToHeader(HttpServletRequest request) {
        super(request);
    }

    public String getHeader(String name) {
        String header = super.getHeader(name);
        return (header != null) ? header : super.getParameter(name); // Note: you can't use getParameterValues() here.
    }

    public Enumeration getHeaderNames() {
        List<String> names = Collections.list(super.getHeaderNames());
        names.addAll(Collections.list(super.getParameterNames()));
        return Collections.enumeration(names);
    }
}

..并用它包装原始请求:

..and wrap the original request with it:

chain.doFilter(new AddParamsToHeader((HttpServletRequest) request), response);






这就是说,我个人认为这是一个坏主意。而是让它直接访问参数或将参数传递给它。


That said, I personally find this a bad idea. Rather give it direct access to the parameters or pass the parameters to it.