Java Servlet 过滤器:如何从 servletRequest 获取所有标头?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25247218/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Servlet Filter: How to get all the headers from servletRequest?
提问by daydreamer
Here is how my WebFilter
looks like
这是我的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() {
}
}
I tried to find out online as to how to get values for HTTP headers
coming from request.
我试图在网上找到关于如何HTTP headers
从请求中获取值的信息。
I did not find anything, so I tried to enumerate on servletRequest.getAttributeNames()
and servletRequest.getParameterNames()
without knowing anything, but I do not get any headers.
我没有找到任何东西,所以我试图枚举servletRequest.getAttributeNames()
和servletRequest.getParameterNames()
不知道什么,但我没有得到任何头。
Question
How can I get all the headers coming from the request?
问题
如何获取来自请求的所有标头?
采纳答案by Buhake Sindi
Typecast ServletRequest
into HttpServletRequest
(only if ServletRequest request
is an instanceof
HttpServletRequest
).
类型ServletRequest
转换为HttpServletRequest
(仅当ServletRequest request
是instanceof
HttpServletRequest
)。
Then you can use HttpServletRequest.getHeader()
and HttpServletRequest.getHeaderNames()
method.
然后你可以使用HttpServletRequest.getHeader()
和HttpServletRequest.getHeaderNames()
方法。
Something like this:
像这样的东西:
@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);
}
回答by Cepr0
With Java 8 you can use a stream to collect request headers:
使用 Java 8,您可以使用流来收集请求标头:
HttpServletRequest httpRequest = (HttpServletRequest) request;
Map<String, String> headers = Collections
.list(httpRequest.getHeaderNames())
.stream()
.collect(Collectors.toMap(h -> h, httpRequest::getHeader));
UPDATED
更新
@Matthias reminded me of the possibility to have multiple values for one header:
@Matthias 提醒我一个标题有多个值的可能性:
Map<String, List<String>>
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
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
https://gist.github.com/Cepr0/fd5d9459f17da13b29126cf313328fe3
回答by Matthias
You should consider that the same HTTP header can occur multiple times with different values:
您应该考虑到相同的 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;
}));