2017-03-04 93 views
0

如何在HttpServletResponse中獲取Content-Type,Server等http響應頭文件?需要獲得所有可用的頭文件。Servlet或過濾器或監聽器中的HttpResponse頭文件

當我們使用openConnection的UrlConnection並使用getHeaderFields時,我們得到了所有這樣的頭文件。但是當我們用HttpServletResponse使用getHeaderNames時,我們沒有得到這樣的頭文件。

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時,我們得到了響應頭和響應頭。而這個響應頭文件正在瀏覽器中打印。因此,相同的響應頭文件,我們可以在servlet或過濾器中獲取它嗎?就像我們做的那樣,將這些頭文件作爲UrlConnection.getHeaderFields的一部分使用 –

回答

0

正如評論中所說,servlet負責在每個http請求的響應中生成頭文件。

標題基本上用於創建客戶端和服務器之間的對話。


GET例

客戶:給我/ MyTestServlet對象,這是我想到的是一個HTML頁面。如果它被壓縮,那會更好,但如果不是,它也可以。

Accept: text/html,application/xhtml+xml 
Accept-Encoding: gzip, deflate 

服務器:好吧,我送的字符集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找到更多信息。


EDIT

有標頭Tomcat的自動設置:

爲了記錄從Tomcat的所有標題,你應該考慮this answer,基本上說:

認沽主機或上下文元素中的AccessLogValve例如:

<Valve className="org.apache.catalina.valves.AccessLogValve" 
directory="logs" prefix="mysitelog." suffix=".txt" 
pattern="..." resolveHosts="false" /> 

+0

在我的doGet中,我沒有給出任何response.addHeader。但在瀏覽器的開發者控制檯中,我們仍然得到3個響應頭。我們如何捕獲這3個頭文件。我的要求是捕獲所有http請求命中的請求和響應頭並將其放入日誌文件中。所以我正在嘗試使用過濾器來做到這一點。但在過濾器中,我得到的只是請求標題 –

+0

我看到了,我用更多的信息更改了我的答案。 – WPomier

+0

我想這隻會寫入日誌文件。在寫入日誌之前,我需要執行一些處理。這就是爲什麼我試圖捕獲代碼。在處理意義上,修改標題名稱。或將這些捕獲的值發送到另一臺服務器。我也嘗試過RequestDumperFilter,但沒有捕獲這些頭文件。 –