写出Tomcat响应头

时间:2018-03-31 14:21:59

标签: java tomcat nginx http-headers servlet-filters

上下文我正在运行一个带有Nginx反向代理的Tomcat 8.5服务器来终止SSL连接,启用更多的压缩。

在Tomcat服务器上,我有一个运行的webapp,它包含一个servlet,welcome-file和两个过滤器。 webapp的目的是将请求和响应头的名称和值写入welcome-file(.jsp页面)和catalina.out。

请求上,所有内容都按预期运行。

响应上,如果尚未在之前的响应中设置,则不会为包含JSESSIONID的Set-Cookie写入execpt。

当我进入Firefox网站开发工具并查看响应时,我会看到像

这样的标题
  • 连接:keep-alive
  • Content-Type:text / html; charset = UTF-8

所以我的问题是,除了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       
}

1 个答案:

答案 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 &quot;%r&quot; %s %b %{Content-Type}o" />

此方法的问题是您必须知道要记录的所有标题名称,并相应地配置您的Valve。我不知道任何捷径。检查RFC2616可以获得完整的标题列表。