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?
Buhake Sindi
Typumwandlung ServletRequest hinein HttpServletRequest (nur wenn ServletRequest request ist ein instanceofHttpServletRequest).
Dann können Sie verwenden HttpServletRequest.getHeader() und HttpServletRequest.getHeaderNames() Methode.
@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
Cepr0
Mit Java 8+ können Sie einen Stream verwenden, um Anforderungsheader zu sammeln:
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: