Java Servlet 过滤器:如何从 servletRequest 获取所有标头?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25247218/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 23:58:56  来源:igfitidea点击:

Servlet Filter: How to get all the headers from servletRequest?

javajakarta-eeservletsservlet-filters

提问by daydreamer

Here is how my WebFilterlooks like

这是我的WebFilter样子

@WebFilter("/rest/*")
public class AuthTokenValidatorFilter implements Filter {

    @Override
    public void init(final FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
        final Enumeration<String> attributeNames = servletRequest.getAttributeNames();
        while (attributeNames.hasMoreElements()) {
            System.out.println("{attribute} " + servletRequest.getParameter(attributeNames.nextElement()));
        }

        final Enumeration<String> parameterNames = servletRequest.getParameterNames();
        while (parameterNames.hasMoreElements()) {
            System.out.println("{parameter} " + servletRequest.getParameter(parameterNames.nextElement()));
        }
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
    }
}

I tried to find out online as to how to get values for HTTP headerscoming from request.

我试图在网上找到关于如何HTTP headers从请求中获取值的信息。

I did not find anything, so I tried to enumerate on servletRequest.getAttributeNames()and servletRequest.getParameterNames()without knowing anything, but I do not get any headers.

我没有找到任何东西,所以我试图枚举servletRequest.getAttributeNames()servletRequest.getParameterNames()不知道什么,但我没有得到任何头。

Question
How can I get all the headers coming from the request?

问题
如何获取来自请求的所有标头?

采纳答案by Buhake Sindi

Typecast ServletRequestinto HttpServletRequest(only if ServletRequest requestis an instanceofHttpServletRequest).

类型ServletRequest转换为HttpServletRequest(仅当ServletRequest requestinstanceofHttpServletRequest)。

Then you can use HttpServletRequest.getHeader()and HttpServletRequest.getHeaderNames()method.

然后你可以使用HttpServletRequest.getHeader()HttpServletRequest.getHeaderNames()方法。

Something like this:

像这样的东西:

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    Enumeration<String> headerNames = httpRequest.getHeaderNames();

    if (headerNames != null) {
            while (headerNames.hasMoreElements()) {
                    System.out.println("Header: " + httpRequest.getHeader(headerNames.nextElement()));
            }
    }

    //doFilter
    chain.doFilter(httpRequest, response);
}

回答by Cepr0

With Java 8 you can use a stream to collect request headers:

使用 Java 8,您可以使用流来收集请求标头:

HttpServletRequest httpRequest = (HttpServletRequest) request;

Map<String, String> headers = Collections
    .list(httpRequest.getHeaderNames())
    .stream()
    .collect(Collectors.toMap(h -> h, httpRequest::getHeader));

UPDATED

更新

@Matthias reminded me of the possibility to have multiple values for one header:

@Matthias 提醒我一个标题有多个值的可能性:

Map<String, List<String>>

Map<String, List<String>>

Map<String, List<String>> headersMap = Collections
    .list(httpRequest.getHeaderNames())
    .stream()
    .collect(Collectors.toMap(
        Function.identity(), 
        h -> Collections.list(httpRequest.getHeaders(h))
    ));

org.springframework.http.HttpHeaders

org.springframework.http.HttpHeaders

HttpHeaders httpHeaders = Collections
    .list(httpRequest.getHeaderNames())
    .stream()
    .collect(Collectors.toMap(
        Function.identity(),
        h -> Collections.list(httpRequest.getHeaders(h)),
        (oldValue, newValue) -> newValue,
        HttpHeaders::new
    ));

https://gist.github.com/Cepr0/fd5d9459f17da13b29126cf313328fe3

https://gist.github.com/Cepr0/fd5d9459f17da13b29126cf313328fe3

回答by Matthias

You should consider that the same HTTP header can occur multiple times with different values:

您应该考虑到相同的 HTTP 标头可以使用不同的值多次出现:

Map<String, Serializable> headers = Collections.list(request.getHeaderNames()).stream().collect(Collectors.toMap(h -> h, h -> {
    ArrayList<String> headerValues = Collections.list(request.getHeaders(h));
    return headerValues.size() == 1 ? headerValues.get(0) : headerValues;
}));