无法使用 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 之间的相关差异:

Tomcat 8

  • LegacyCookieProcessor 是默认的 cookie 处理器
  • Tomcat VM 参数 FWD_SLASH_IS_SEPARATOR
  • 具有重要意义
  • 严格遵守RFC2109

Tomcat 9

  • 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