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

day*_*mer 43 java servlets java-ee servlet-filters

这就是我的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() {
    }
}
Run Code Online (Sandbox Code Playgroud)

我试图在网上找到如何获得HTTP headers来自请求的价值.

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

问题
如何从请求中获取所有标题?

Buh*_*ndi 77

Typecast ServletRequestinto HttpServletRequest(仅当ServletRequest request是一个instanceof HttpServletRequest).

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

像这样的东西:

@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);
}
Run Code Online (Sandbox Code Playgroud)


Cep*_*pr0 31

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

HttpServletRequest httpRequest = (HttpServletRequest) request;

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


Mat*_*ias 5

您应该考虑到相同的 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;
}));
Run Code Online (Sandbox Code Playgroud)