首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Servlet过滤器:如何从servletRequest获取所有头文件?

Servlet过滤器:如何从servletRequest获取所有头文件?
EN

Stack Overflow用户
提问于 2014-08-11 23:44:19
回答 3查看 117.6K关注 0票数 76

下面是我的WebFilter的样子

代码语言:javascript
复制
@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() {
    }
}

我尝试在网上查找如何从request获取HTTP headers的值。

我没有找到任何东西,所以我尝试在不知道任何东西的情况下在servletRequest.getAttributeNames()servletRequest.getParameterNames()上枚举,但我没有得到任何头部。

问题

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-11 23:45:49

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

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

如下所示:

代码语言:javascript
复制
@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);
}
票数 105
EN

Stack Overflow用户

发布于 2018-04-11 17:39:13

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

代码语言:javascript
复制
HttpServletRequest httpRequest = (HttpServletRequest) request;

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

已更新

@Matthias提醒我,headers可以有多个值:

Map<String, List<String>>

代码语言:javascript
复制
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

代码语言:javascript
复制
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

票数 59
EN

Stack Overflow用户

发布于 2019-07-09 18:54:26

您应该考虑到,相同的HTTP报头可能会多次出现,但具有不同的值:

代码语言:javascript
复制
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;
}));
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25247218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档