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

Lesezeit: 3 Minuten

Hier ist, wie mein WebFilter sieht aus wie

@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 man Werte für erhält HTTP headers kommt von Anfrage.

Ich habe nichts gefunden, also habe ich versucht, weiter aufzuzählen servletRequest.getAttributeNames() und servletRequest.getParameterNames() ohne etwas zu wissen, aber ich bekomme keine Header.

Frage

Wie bekomme ich alle Header aus der Anfrage?

Benutzer-Avatar
Buhake Sindi

Typumwandlung ServletRequest hinein HttpServletRequest (nur wenn ServletRequest request ist ein instanceof HttpServletRequest).

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

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

  • @BuhakeSindi gibt es Indikatoren unter welchen Umständen ServletRequest könnte etw. sein anders als ein HttpServletRequest?

    – etw

    17. Oktober 2015 um 12:41 Uhr

  • ‘HttpServletReqiest’ IST EINE ‘ServletRequest’. Es ist eine Unterschnittstelle von. ServletRequest. Es kann verschiedene Klassen/Schnittstellen von ServletRequest wie „PortletRequest“ geben, daher muss immer eine „instanceof“-Prüfung für verschiedene Servlet-Typen durchgeführt werden.

    – Buhake Sindi

    17. Oktober 2015 um 16:32 Uhr

  • Warum getHeaderNames(); Haben Sie einen Header wie x-forward-for, Keep-Alive-Details usw. verpasst?

    – Asif Mushtaq

    26. August 2016 um 20:06 Uhr

  • @UnKnown diese Header werden von den Proxy-Servern ausgefüllt. Es muss auf Serverebene konfiguriert werden. Das Servlet gibt nur die von diesen Servern festgelegten Parameter zurück.

    – Buhake Sindi

    21. Februar 2017 um 6:23 Uhr

Benutzer-Avatar
Cepr0

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 daran erinnert, dass Header mehrere Werte haben können:

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

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

  • hast du versucht das zu kompilieren?

    – Eugen

    13. Februar 2019 um 3:00 Uhr

  • Ich musste es für den Frühling leicht optimieren – response.getHeaderNames() .stream() .collect(Collectors.toMap( Function.identity(), h -> new ArrayList<>(response.getHeaders(h)), (oldValue, newValue) -> newValue, HttpHeaders::new ));

    – Bobmarksie

    21. Oktober 2019 um 16:30 Uhr

  • @bobmarksie in deiner Variante, die du verwendest responseaber die Frage war ungefähr request. Leider HttpServletRequest#getHeaderNames kehrt zurück Enumerationnicht Collection.

    – Cepr0

    21. Oktober 2019 um 17:11 Uhr

  • Danke @Cepr0! Ich fand Ihre Antwort immer noch sehr nützlich, obwohl ich sie auf andere Weise verwendet habe.

    – Bobmarksie

    22. Oktober 2019 um 8:51 Uhr

  • Besonders Gist-URL ist nützlich zum Testen und klärt alle Zweifel.

    – Paramesh Korrakuti

    24. Februar um 9:28 Uhr

Beachten Sie, 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;
}));

  • Bitte nicht mischen String und ArrayList in Serializable. Beim Verzehr der Mapmüsste ich instanceof die Werte nochmal.

    – Alexander Dumont

    30. November 2021 um 12:35 Uhr

In einer Spring-Boot-Anwendung funktioniert dies in jeder Methode (mit Java 8)

    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.context.request.ServletRequestAttributes;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Collections;
    
...
...

    public void anyMethod(){
        HttpServletRequest req = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        Collections.list(req.getHeaderNames()).stream().forEach(System.out::println);
    }

1229830cookie-checkServlet-Filter: Wie bekomme ich alle Header von servletRequest?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy