javagc 提到的 context.xml 更改只会重新配置您的会话 cookie。
要更改所有 cookie,您有 2 个选项:
选项 1) 更新您的应用程序代码以使用更安全的方法添加 cookie。示例:https://stackoverflow.com/a/30488471/95674
选项 2)您可以配置一个 servlet 过滤器来更改通过系统的所有(其他)cookie。将这 2 个类添加到 WAR 中的适当包中。然后更新您的 web.xml,如下所述。
如果您愿意添加对 OWASP 库的依赖项,可以在 OWASP 站点上列出一个更简单的选项 2 示例。位于此处:https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly
响应包装器
这会将 http only 标志添加到包装响应上的所有 cookie。
public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {
public HttpOnlyResponseWrapper(HttpServletResponse res) {
super(res);
}
public void addCookie(Cookie cookie) {
StringBuilder header = new StringBuilder();
if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
header.append(cookie.getName());
}
if (cookie.getValue() != null) {
// Empty values allowed for deleting cookie
header.append("=" + cookie.getValue());
}
if (cookie.getVersion() == 1) {
header.append(";Version=1");
if (cookie.getComment() != null) {
header.append(";Comment=\"" + cookie.getComment() + "\"");
}
if (cookie.getMaxAge() > -1) {
header.append(";Max-Age=" + cookie.getMaxAge());
}
} else {
if (cookie.getMaxAge() > -1) {
Date now = new Date();
now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
header.append(";Expires=" + cookieFormat.format(now));
}
}
if (cookie.getDomain() != null) {
header.append(";Domain=" + cookie.getDomain());
}
if (cookie.getPath() != null) {
header.append(";Path=" + cookie.getPath());
}
if (cookie.getSecure()) {
header.append(";Secure");
}
header.append(";httpOnly");
addHeader("Set-Cookie", header.toString());
}
}
过滤器
此过滤器将配置的响应包装在上述包装器中。
package yourpackage;
@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
this.config = null;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
chain.doFilter(req, hres);
}
public FilterConfig getFilterConfig() {
return this.config;
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
改编自(警告:不是精确副本!)来源:http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html
web.xml
最后一个细节:仅当您在系统中关闭注释扫描时:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
version="2.5" ***metadata-complete="true"***>
</web-app>
然后你需要在你的 web.xml 文件中手动配置上面的过滤器,像这样:
<filter>
<filter-name>HttpOnlyFilter
<filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
<filter-name>HttpOnlyFilter
<url-pattern>/*
</filter-mapping>
如果您的应用扫描注释(这是默认设置),则不需要 web.xml 部分。