无法使用 LegacyCookieProcessor 从响应中删除 cookie 并重定向到相同的来源 URL
Can't Remove cookie from response using LegacyCookieProcessor and redirect to same originating URL
我必须从响应中删除 Cookie 并重定向回相同的请求 URL。我最近升级到 tomcat 9 并开始使用 LegacyCookieProcessor 来避免无效域错误。但出于某种原因,我无法删除 cookie 并重定向到相同的 URL,随后的调用在请求中没有 cookie。
下面是我用来删除 cookie 的代码:
public static void removeCookie(String name, HttpServletRequest req, HttpServletResponse res) {
boolean isSecure = req.isSecure();
String domain = getDomain(req);
String path = "/";
String cookieName = getTicketCookiePrefix() + name;
addCookie(req, res, cookieName, "", 0, path, domain, isSecure);
Cookie[] cookies = req.getCookies();
if (cookies != null) {
Cookie[] var8 = cookies;
int var9 = cookies.length;
for(int var10 = 0; var10 < var9; ++var10) {
Cookie cookie = var8[var10];
if (cookie.getName().equals(cookieName)) {
cookie.setValue("");
}
}
}
}
public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, int cookielife, String path, String domain, boolean secure) {
Cookie ck = createCookie(name, encodeCookieValue(value));
if (path != null) {
ck.setPath(path);
}
if (domain != null) {
ck.setDomain(domain);
}
ck.setMaxAge(cookielife);
ck.setSecure(secure);
response.addCookie(ck);
}
请告诉我我们需要对旧版 cookie 处理器做任何不同的事情来删除 cookie。
问题陈述:User-agent (IE) 无法使用 'Set-Cookie' header
处理(删除)cookie
Tomcat 8 和 9 之间的相关差异:
- LegacyCookieProcessor 是默认的 cookie 处理器
- Tomcat VM 参数 FWD_SLASH_IS_SEPARATOR
具有重要意义
- 严格遵守RFC2109
- Rfc6265CookieProcessor 是默认的 cookie 处理器
- tomcat VM 参数 FWD_SLASH_IS_SEPARATOR
没有意义
cookie 处理器之间的相关差异:
旧版 cookie 解析算法仅支持通过多个系统属性进行有限的全局配置。这些系统属性仍然受支持,但将被弃用以支持这个新的配置元素。
参考:tomcat-8.0, tomcat-8.5
LegacyCookieProcessor
- 实施对 cookie 规范的严格解释 if
- STRICT_SERVLET_COMPLIANCE 为真,强制执行 RFC2109
Rfc6265CookieProcessor
- 可互操作,但不允许使用点 (.) 声明域
使用的组合:Tomcat9 + LegacyCookieProcessor
- 如果 STRICT_SERVLET_COMPLIANCE 设置为 true,则 FWD_SLASH_IS_SEPARATOR 的隐式值也设置为 true
- 并且'/'(正斜杠)字符将被视为分隔符
- “如果按照严格遵守规范的要求引用路径属性,某些浏览器将无法处理 cookie”
- 通常我们 运行 Tomcat 使用以下内容:
org.apache.catalina。 STRICT_SERVLET_COMPLIANCE=真,org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=假
- 因此,为了改变这种行为,在 LegacyCookieProcessor 中使用 forwardSlashIsSeparator 属性,而不是在 Tomcat 9
中使用 FWD_SLASH_IS_SEPARATOR
解决方法:
将 VM 参数 FWD_SLASH_IS_SEPARATOR 替换为上下文中的 LegacyCookieProcessor.forwardSlashIsSeparator 属性。xml/CookieProcessor
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" forwardSlashIsSeparator="false"/>
参考:
RFC2109 - https://www.ietf.org/rfc/rfc2109.txt
RFC6265 - https://www.ietf.org/rfc/rfc6265.txt
我必须从响应中删除 Cookie 并重定向回相同的请求 URL。我最近升级到 tomcat 9 并开始使用 LegacyCookieProcessor 来避免无效域错误。但出于某种原因,我无法删除 cookie 并重定向到相同的 URL,随后的调用在请求中没有 cookie。
下面是我用来删除 cookie 的代码:
public static void removeCookie(String name, HttpServletRequest req, HttpServletResponse res) {
boolean isSecure = req.isSecure();
String domain = getDomain(req);
String path = "/";
String cookieName = getTicketCookiePrefix() + name;
addCookie(req, res, cookieName, "", 0, path, domain, isSecure);
Cookie[] cookies = req.getCookies();
if (cookies != null) {
Cookie[] var8 = cookies;
int var9 = cookies.length;
for(int var10 = 0; var10 < var9; ++var10) {
Cookie cookie = var8[var10];
if (cookie.getName().equals(cookieName)) {
cookie.setValue("");
}
}
}
}
public static void addCookie(HttpServletRequest request, HttpServletResponse response, String name, String value, int cookielife, String path, String domain, boolean secure) {
Cookie ck = createCookie(name, encodeCookieValue(value));
if (path != null) {
ck.setPath(path);
}
if (domain != null) {
ck.setDomain(domain);
}
ck.setMaxAge(cookielife);
ck.setSecure(secure);
response.addCookie(ck);
}
请告诉我我们需要对旧版 cookie 处理器做任何不同的事情来删除 cookie。
问题陈述:User-agent (IE) 无法使用 'Set-Cookie' header
处理(删除)cookieTomcat 8 和 9 之间的相关差异:
- LegacyCookieProcessor 是默认的 cookie 处理器
- Tomcat VM 参数 FWD_SLASH_IS_SEPARATOR 具有重要意义
- 严格遵守RFC2109
- Rfc6265CookieProcessor 是默认的 cookie 处理器
- tomcat VM 参数 FWD_SLASH_IS_SEPARATOR 没有意义
cookie 处理器之间的相关差异: 旧版 cookie 解析算法仅支持通过多个系统属性进行有限的全局配置。这些系统属性仍然受支持,但将被弃用以支持这个新的配置元素。 参考:tomcat-8.0, tomcat-8.5
LegacyCookieProcessor
- 实施对 cookie 规范的严格解释 if
- STRICT_SERVLET_COMPLIANCE 为真,强制执行 RFC2109
Rfc6265CookieProcessor
- 可互操作,但不允许使用点 (.) 声明域
使用的组合:Tomcat9 + LegacyCookieProcessor
- 如果 STRICT_SERVLET_COMPLIANCE 设置为 true,则 FWD_SLASH_IS_SEPARATOR 的隐式值也设置为 true
- 并且'/'(正斜杠)字符将被视为分隔符
- “如果按照严格遵守规范的要求引用路径属性,某些浏览器将无法处理 cookie”
- 通常我们 运行 Tomcat 使用以下内容: org.apache.catalina。 STRICT_SERVLET_COMPLIANCE=真,org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=假
- 因此,为了改变这种行为,在 LegacyCookieProcessor 中使用 forwardSlashIsSeparator 属性,而不是在 Tomcat 9 中使用 FWD_SLASH_IS_SEPARATOR
解决方法: 将 VM 参数 FWD_SLASH_IS_SEPARATOR 替换为上下文中的 LegacyCookieProcessor.forwardSlashIsSeparator 属性。xml/CookieProcessor
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" forwardSlashIsSeparator="false"/>
参考: RFC2109 - https://www.ietf.org/rfc/rfc2109.txt RFC6265 - https://www.ietf.org/rfc/rfc6265.txt