我與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