it-swarm.com.de

Servlet-Filter: Wie bekomme ich alle Header von servletRequest?

So sieht mein WebFilter aus

@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() {
    }
}

Ich habe versucht, online herauszufinden, wie Werte für HTTP headers Aus der Anfrage abgerufen werden können.

Ich habe nichts gefunden, also habe ich versucht, servletRequest.getAttributeNames() und servletRequest.getParameterNames() aufzulisten, ohne etwas zu wissen, aber ich erhalte keine Überschriften.

Frage
Wie kann ich alle Header aus der Anfrage abrufen?

38
daydreamer

Tippe ServletRequest in HttpServletRequest (nur wenn ServletRequest request Ein instanceofHttpServletRequest ist).

Dann können Sie HttpServletRequest.getHeader() und HttpServletRequest.getHeaderNames() verwenden.

Etwas wie das:

@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);
}
72
Buhake Sindi

Mit Java 8 können Sie einen Stream verwenden, um Anforderungsheader zu sammeln:

HttpServletRequest httpRequest = (HttpServletRequest) request;

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

[~ # ~] aktualisiert [~ # ~]

@Matthias hat mich an die Möglichkeit erinnert, mehrere Werte für einen Header zu haben:

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))
    ));

HttpHeaders

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

https://Gist.github.com/Cepr0/fd5d9459f17da13b29126cf313328fe

26
Cepr0

Sie sollten berücksichtigen, dass derselbe HTTP-Header mehrmals mit unterschiedlichen Werten auftreten kann:

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;
}));
1
Matthias