在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的顶部试过吗?
答
我与Google App Engine存在同样的问题,但我想将Secure
属性添加到所有Cookie中。以下显示了我如何将Secure
属性添加到所有Cookie。我几乎可以肯定,这种解决方案只适用于Secure
和HttpOnly
。
我已经实现了安全过滤器,并对我想要设置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);
}
}
您的web.xml配置尝试需要Servlet 3.0版本。您的GAE环境是否符合此要求? – BalusC 2013-05-06 13:31:17