我们如何在HttpServletResponse中获取内容类型,服务器等的http响应头?需要获得所有可用的标题。
当我们使用UrlConnection的openConnection并使用getHeaderFields时,我们会得到所有这些标题。但是当我们将getHeaderNames与HttpServletResponse一起使用时,我们没有得到这样的标题。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
Enumeration<String> requestHeaders = request.getHeaderNames();
while(requestHeaders.hasMoreElements())
{
String header = requestHeaders.nextElement();
System.out.println("request headerrrrrrr>>" + header);
}
Collection<String> responseHeaders = response.getHeaderNames();
Iterator<String> it = responseHeaders.iterator();
while(it.hasNext()){
String header = it.next();
System.out.println("response headerrrrrr>>" + header);
}
response.getWriter().append("Served at: ").append(request.getContextPath());
}
在chrome开发人员工具中,我可以看到下面的
General
Request URL:http://localhost:8080/TestWebApp/MyTestServlet
Request Method:GET
Status Code:200 OK
Remote Address:[::1]:8080
Response Headers
Content-Length:22
Date:Fri, 03 Mar 2017 07:40:56 GMT
Server:Apache-Coyote/1.1
Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch, br
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Cookie:JSESSIONID=DF62FC092F67FBB02AF68BC646085065; ai_user=MKfG+|2017-03-02T10:44:54.721Z; _ga=GA1.1.1362801303.1488451499
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
但是控制台输出只是请求标头
request headerrrrrrr>>host
request headerrrrrrr>>connection
request headerrrrrrr>>upgrade-insecure-requests
request headerrrrrrr>>user-agent
request headerrrrrrr>>accept
request headerrrrrrr>>accept-encoding
request headerrrrrrr>>accept-language
request headerrrrrrr>>cookie
我在Log only http servlet response headers的BalusC回答提及中提到过。但似乎没有像我需要的那样工作
使用doFilter方法创建一个过滤器,如下所示
public void doFilter(ServletRequest request, final ServletResponse response, FilterChain chain) throws IOException, ServletException {
DOMConfigurator.configure("C:\\log4j.xml");
Logger logger = Logger.getLogger(TestFilter.class);
logger.info("do Filter TestFilter");
final Map<String, List<String>> headers = new HashMap<String, List<String>>();
chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) {
@Override public void setHeader(String name, String value) {
List<String> values = new ArrayList<String>();
values.add(value);
headers.put(name, values);
super.setHeader(name, value);
}
@Override public void addHeader(String name, String value) {
List<String> values = headers.get(name);
if (values == null) {
values = new ArrayList<String>();
headers.put(name, values);
}
values.add(value);
super.addHeader(name, value);
}
});
logger.info("headers size>>"+headers.size());
logger.info("these are the headers>>"+headers);
}
控制台日志
INFO 2017-03-03 05:14:23,765 [http-bio-8080-exec-3] com.test.TestFilter - do Filter TestFilter
INFO 2017-03-03 05:14:23,768 [http-bio-8080-exec-3] com.test.TestFilter - headers size>>0
INFO 2017-03-03 05:14:23,768 [http-bio-8080-exec-3] com.test.TestFilter - these are the headers>>{}
也许我错过了什么?
答案 0 :(得分:0)
正如在评论中所说,servlet负责在响应每个http请求时生成标头。
标题基本上用于在客户端和服务器之间创建对话。
获取示例
客户端:给我/ MyTestServlet
对象,我希望它是一个html页面。如果它被压缩它会更好,但如果不是它也没关系。
Accept: text/html,application/xhtml+xml
Accept-Encoding: gzip, deflate
服务器:好的,我在charset iso-8859-1中发送了一个html,抱歉它没有按照您的要求压缩,长度为9639字节,最后一次修改是在2月13日.BTW ,我是“MySuperServer”。
Content-Type: text/html
Content-Length: 9639
Last-Modified: Mon, 13 Feb 2017 12:47:56 GMT
Server: MySuperServer
这个GET的代码是:
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String contentType = request.getHeader("Accept");
if (contentType.contains("text/html") || contentType.contains("*/*")) {
// the client expects for a web page (or anything), so let's send it
String page = createSomehowPage();
response.addHeader("Content-Type", "text/html");
response.addHeader("Content-Length", String.valueOf(page.length()));
response.addHeader("Last-Modified", "Mon, 13 Feb 2017 14:42:56 GMT");
response.addHeader("Server", "MySuperServer");
response.getWriter().append(page);
response.setStatus(200);
} else {
response.addHeader("Server", "MySuperServer");
response.getWriter().append("Sorry, I don't serve the content-Type '").append(contentType).append("' you asked");
response.setStatus(406); // 406=Not Acceptable
}
}
您可以在HTTP Headers中找到更多信息。
修改强>
Tomcat会自动设置标头:
Server
:Tomcat Coyote使用Protocol's Server header definition设置的强制标题(请参阅server.xml configuration)(请参阅“服务器”部分)。Date
:(见Protocol's Date header definition)Content-Length
:(见discussion about it)为了记录Tomcat中的所有标题,您应该考虑this answer,基本上说:
将AccessLogValve放在Host或Context元素中,例如:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="mysitelog." suffix=".txt" pattern="..." resolveHosts="false" />