2015-04-02 59 views
1

我需要限制對包含會話令牌的cookie的訪問,以便javascript無法訪問它。 給出的建議是在Cookie上設置Secure和HttpOnly標誌。在Spring MVC控制器中創建的Cookie上設置http-only

我在使用@ResponseBody時沒有設置Cookie,所以我在Cookie中設置了HandlerInterceptor。

public class COOKIEFilter implements org.springframework.web.servlet.HandlerInterceptor { 

    @Override 
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { 

     Cookie cookie = new Cookie("timestamp", new Long(new Date().getTime()).toString()); 
     cookie.setSecure(true); 
     // how do I set the http-only flag? 
     httpServletResponse.addCookie(cookie); 

     return true; 
    } 

如Chrome瀏覽器控制檯中顯示,安全設置,而不是http

Showing that secure flag is being set

我已經嘗試添加參數下的servlet到web.xml 3.0規格說明,允許安全和HTTP - 只能設置會話cookie,但因爲我需要自己處理會話(Spring MVC應用程序需要保持無狀態),所以這對我不起作用。

更新:

我使用Tomcat7,目前從Servlet 2.5和Spring 3.2.8。

回答

3

它可以設置爲cookie.setHttpOnly(true)就像您爲了安全一樣。

+0

讓我試着加大了Servlet規範到3 – 2015-04-02 06:26:01

+0

我沒有使用自旋微觀MVC框架,但是這適用於Java servlet。是'javax.servlet.http.Cookie'使用的'Cookie'嗎? – wolfram77 2015-04-02 06:26:11

+0

這是正確的:javax.servlet.http.Cookie;從哪個servlet版本設置Http只支持? – 2015-04-02 06:33:48

0

替換:

Cookie cookie = new Cookie("timestamp", new Long(new Date().getTime()).toString()); 

具有以下

Cookie cookie = new Cookie("timestamp", new Long(new Date().getTime()).toString()+";HttpOnly"); 

這可能會實現。

+0

這只是將值設置爲「1427955447675 Http-Only」 – 2015-04-02 06:18:39

+0

是的,我錯過了把;正如你所說,這也行不通。我可以知道你使用的服務器嗎?因爲某些服務器級別的配置可能會導致衝突 – 2015-04-02 06:28:15

0

您需要設置HttpOnly如下:

Cookie cookie = new Cookie("timestamp", new Long(new Date().getTime()).toString() + ";HttpOnly"); 

它需要遵循cookieName=cookieValue;HttpOnly;Secure格式

+0

我在Chrome控制檯中看到的值現在是「142795578​​9419」,但沒有設置HTTP標誌 – 2015-04-02 06:23:50

+0

您的意思是說在上述更改之後,您仍然沒有看到'HttpOnly'? – Mithun 2015-04-02 06:26:21

相關問題