2013-05-06 87 views
3

我需要在Google App Engine中的會話Cookie上設置httpOnly和安全標誌。在Google App Engine的會話Cookie中設置httpOnly和安全標誌

我試着在web.xml如下:

<session-config> 
<cookie-config> 
    <http-only>true</http-only> 
</cookie-config> 
</session-config> 

但是,這並不工作。

String sessionid = request.getSession().getId(); 
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

我怎樣才能做到這一點:

我也是在每一個JSP的頂部試過嗎?

+0

您的web.xml配置嘗試需要Servlet 3.0版本。您的GAE環境是否符合此要求? – BalusC 2013-05-06 13:31:17

回答

3

我與Google App Engine存在同樣的問題,但我想將Secure屬性添加到所有Cookie中。以下顯示了我如何將Secure屬性添加到所有Cookie。我幾乎可以肯定,這種解決方案只適用於SecureHttpOnly

我已經實現了安全過濾器,並對我想要設置Secure屬性的頁面進行映射。

<filter> 
    <filter-name>Security Filter</filter-name> 
    <filter-class>common.SecurityFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>Security Filter</filter-name> 
    <url-pattern>*.jsf</url-pattern> 
</filter-mapping> 

我第一次嘗試是包裹響應到我的自定義HttpServletResponseWrapper。一切都很好,除了會話cookie沒有獲得該屬性。我調試過,並發現會話cookie不會使用我所期望的機制添加。然後我注意到,在你觸摸會話之後,會話cookie被神奇地添加到響應頭,例如標題現在包含行Set-Cookie: JSESSIONID=abcdef;Path=/,但未使用我創建的包裝器對象添加cookie。我已經發現,在我觸及會話後,我可以使用我想要的屬性設置我想要的cookie。所以解決方法很簡單。

public class SecurityFilter implements Filter { 
    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     // wrap the response 
     response = new SecureCookieSetter((HttpServletResponse)response); 

     // touch the session 
     (HttpServletRequest)request.getSession(); 

     // overwriting the cookie with Secure attribute set 
     ((HttpServletResponse)response).setHeader("Set-Cookie", "JSESSIONID=" + ((HttpServletRequest)request).getSession().getId() + ";Path=/"); 
    } 
} 

public class SecureCookieSetter extends HttpServletResponseWrapper { 

    public SecureCookieSetter(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public void addCookie(Cookie cookie) { 
     cookie.setSecure(true); 
     super.addCookie(cookie); 
    } 

    @Override 
    public void addHeader(String name, String value) { 
     if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) { 
      value = value + ";Secure"; 
     } 
     super.addHeader(name, value); 
    } 

    @Override 
    public void setHeader(String name, String value) { 
     if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) { 
      value = value + ";Secure"; 
     } 
     super.setHeader(name, value); 
    } 

} 
相關問題