上下文我正在运行一个带有Nginx反向代理的Tomcat 8.5服务器来终止SSL连接,启用更多的压缩。
在Tomcat服务器上,我有一个运行的webapp,它包含一个servlet,welcome-file和两个过滤器。 webapp的目的是将请求和响应头的名称和值写入welcome-file(.jsp页面)和catalina.out。
在请求上,所有内容都按预期运行。
在响应上,如果尚未在之前的响应中设置,则不会为包含JSESSIONID的Set-Cookie写入execpt。
当我进入Firefox网站开发工具并查看响应时,我会看到像
这样的标题所以我的问题是,除了JSESSIONID之外,Tomcat没有设置任何响应标头吗?或者根本不可能写出"默认"响应标题及其值,因为它们被认为是不言自明的,这些标题总是存在?
请注意。当JSESSIONID已经设置并且我调用httpResponse.getHeaderNames()。size()时它返回0(零)
WriteResponseHeaders.java
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
ServletContext sc = filterConfig.getServletContext();
// Run when receiving the request from the client
// Response cookie and headers changes are done here
chain.doFilter(httpRequest, httpResponse);
// Run when sending the response to the client
String newline = System.getProperty("line.separator");
String spaces = "==========================";
String projectname = sc.getInitParameter("projectName");
StringBuilder sb = new StringBuilder();
sb.append(spaces + "start" + spaces + newline);
sb.append(spaces + "Project name: " + projectname + spaces + newline);
sb.append(spaces + "Filter name: " + filterConfig.getInitParameter("name") + spaces + newline);
Collection<String> responseHeaders = httpResponse.getHeaderNames();
for(String headerName : responseHeaders) {
sb.append("header name: " + headerName + newline
+ "header value: " + httpResponse.getHeader(headerName) + newline + newline);
}
sb.setLength(sb.length()-1);//remove the extra newline at the end of the last iteration.
sb.append(spaces + " End " + spaces + newline);
sb.append(spaces + projectname + spaces);
System.out.println(sb.toString());//Print to catalina.out
}
答案 0 :(得分:1)
所以我的问题是,Tomcat除了之外没有设置任何响应头 JSESSIONID?
它当然设置了所有其他标题,或者它无法正常工作。
或者根本不可能写出“默认” 响应报头
您可以在日志中写下它们。要实现此目的,请启用Access Log Valve。例如,要记录您提到的Content-Type:
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="custom-localhost_access_log." suffix=".txt" pattern="%a "%r" %s %b %{Content-Type}o" />
此方法的问题是您必须知道要记录的所有标题名称,并相应地配置您的Valve。我不知道任何捷径。检查RFC2616可以获得完整的标题列表。