2010-06-07 122 views
11

我試圖在JSESSIONID cookie上設置httponly標誌。但是,我正在使用Java EE 5,但不能使用setHttpOnly()。首先,我嘗試使用response.setHeader()從servlet的doPost()中創建我自己的JSESSIONID cookie。在JSESSIONID Cookie中設置httponly(Java EE 5)

當這沒有奏效,我試了response.addHeader()。那也行不通。然後,我瞭解到servlet處理將會話轉換爲JSESSIONID cookie並將其插入到http頭中,因此如果我想使用該cookie,則必須編寫一個過濾器。我寫了一個過濾器,並在那裏玩setHeader()/addHeader(),再次無濟於事。

然後,我瞭解到,有一個在響應對象回事它到達過濾器之前,所以如果我要處理的數據,我需要延長HttpServletResponseWrapper,並傳遞到filterChain.doFilter()一些沖洗/關閉動作。這樣做,但我仍然沒有得到結果。顯然我做錯了什麼,但我不知道是什麼。

我不確定這是否與手邊的問題完全相關,但是servlet沒有將任何html文檔返回給瀏覽器。真正發生的是一些對象正在被填充並返回給JSP文檔。我曾假設Session對象變成了一個JSESSIONID cookie,並且在發送到瀏覽器之前,將其包裝在一個http頭中,並與對象一起添加到請求中。

我很樂意發佈一些代碼,但我想排除我的困難源自對理論的誤解。

+0

rwise這是一個無法接近的牆文本。可能仍然會考慮發佈您嘗試過的示例代碼。 – 2010-06-07 19:35:01

回答

10

由於JSESSIONID cookie由servletcontainer管理,因此此設置是特定於servletcontainer的。目前還不清楚您使用的是哪一個,所以這裏有一個Apache Tomcat 6.0目標回答,以便您知道在哪個方向上您必須查找您的servlet容器:您需要將網絡應用程序的<Context>元素的useHttpOnly屬性設置爲true

<Context useHttpOnly="true"> 
    ... 
</Context> 

也看到這個Tomcat documentation有關<Context>元素。

+0

我越探究這個話題,我就越意識到我幾乎所有的事情都是完全無知的。我使用的是JBOSS 4.0,但是從我已經準備好的,JBOSS是一個EJB容器(?)。我不確定我使用的是什麼servletcontainer。當我發現我的servletcontainer是什麼時,我將不得不再次發佈。 – Mythandros 2010-06-15 15:21:34

+0

JBoss是一個應用程序服務器。它使用Tomcat作爲servlet容器,並在其上增加了一些EJB和其他花哨的JavaEE功能。 EJB的故事在這裏是無關緊要的。這是一個HTTP/Servlet問題。順便說一句,我不確定舊的JBoss 4.0是否支持這個屬性......至少,這些指令與Tomcat相同。 – BalusC 2010-06-15 15:37:05

+0

看起來連JBoss 4.3都不支持,你需要5.0:https://問題。jboss.org/browse/JBPAPP-3088 – 2011-02-10 16:44:21

5

您可以使用Java EE 5使用:

對於Java企業版之前的版本Java EE 6的一個共同的解決辦法是,明確追加會話cookie值僅Http覆蓋SET-COOKIE HTTP響應頭標誌:

String sessionid = request.getSession().getId(); 
// be careful overwriting: JSESSIONID may have been set with other flags 
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

來源:https://www.owasp.org/index.php/HttpOnly

我測試到增加了一些代碼格式化,因爲行吟詩人過濾

相關問題