在Google App Engine的会话Cookie中设置httpOnly和安全标志

问题描述:

我需要在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

我与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); 
    } 

}