vis*_*esh 4 google-app-engine servlets session-cookies
我需要在Google App Engine中的会话cookie上设置httpOnly和安全标志.
我尝试了以下内容web.xml:
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.
我也在每个JSP的顶部尝试过这个:
String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我在使用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>
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是将响应包装到我的自定义中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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8779 次 |
| 最近记录: |