如何在 tomcat 8 中将 Cookie 处理器更改为 LegacyCookieProcessor

How to change Cookie Processor to LegacyCookieProcessor in tomcat 8

我的代码在 tomcat 8 版本 8.0.33 上运行,但在 8.5.4 上我得到: 为此 cookie 指定的域 [.mydomain] 无效。

我发现 tomcat 8 个最新版本中引入了 Rfc6265CookieProcessor。

官方文档上说这可以在 context.xml 中还原为 LegacyCookieProcessor,但我不知道如何。

请告诉我该怎么做。

谢谢

您可以在context.xml

中尝试
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />

参考: https://tomcat.apache.org/tomcat-8.0-doc/config/cookie-processor.html

启用 LegacyCookieProcessor(在 Tomcat 的早期版本中使用)解决了我的应用程序中的问题。正如 linzkl 提到的,这在 Apache 的网站 https://tomcat.apache.org/tomcat-8.0-doc/config/cookie-processor.html 中有解释。

原因是新版本Tomcat不理解.正在使用的Cookie域名前的(点)。

此外,请务必在使用 Internet Explorer 时选中 this post。显然,它很可能会破裂。

您可以在以下路径找到context.xml。

tomcat8/conf/context.xml

<?xml version="1.0" encoding="UTF-8”?>
<!-- The contents of this file will be loaded for each web application —>
<Context>
<!-- Default set of monitored resources. If one of these changes, the    -->
<!-- web application will be reloaded.                                   -->

<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!-- <Manager pathname="" /> -->
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor"/>
</Context>

问题仍然存在于 Tomcat9。 Tomcat 9 需要遵循相同的过程来设置 class.

在 context.xml 文件中添加 class。

如果你是用eclipse来运行的应用,需要在server文件夹下的context.xml文件里设置。请参考以下屏幕截图以获取更多参考。

希望这对某人有所帮助。

案例 1:您正在使用 独立版 Tomcat 并且 具有访问权限更改 tomcat 服务器

中的文件

请关注@linzkl

情况 2:您正在使用 独立版 Tomcat,但您 没有访问权限 更改 tomcat 服务器

中的文件

在您的应用程序的 src/main/webapp/META-INF 文件夹下创建一个名为 context.xml 的新文件并粘贴下面给出的内容

<?xml version="1.0" encoding="UTF-8"?> 
<Context>
  <WatchedResource>WEB-INF/web.xml</WatchedResource>
  <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
  <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> 
  <CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
</Context>

当您在 Standalone Tomcat 中部署应用程序时,您放置在 META-INF 文件夹下的 context.xml 文件将覆盖 context.xml 中给出的文件tomcat/conf/context.xml

注意:如果您遵循此解决方案,则必须对每个应用程序都执行此操作,因为META-INF/context.xml 特定于应用程序

案例 3:您正在使用 嵌入式 Tomcat

为 WebServerFactoryCustomizer 创建一个新 bean

@Bean
WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
    return new WebServerFactoryCustomizer<TomcatServletWebServerFactory>() {

        @Override
        void customize(TomcatServletWebServerFactory tomcatServletWebServerFactory) {
            tomcatServletWebServerFactory.addContextCustomizers(new TomcatContextCustomizer() {
                @Override
                public void customize(Context context) {
                    context.setCookieProcessor(new LegacyCookieProcessor());
                }
            });
        }
    };
}

正如@atul 所提到的,这个问题在 Tomcat 9 中仍然存在。它很可能会随着 Tomcat 的所有未来版本继续前进,因为这是新标准。

使用 legacy cookie 处理器(通过将上面的行添加到 context.xml 文件)对我们来说效果很好。然而,真正的 'fix' 是首先 调整 cookie 的形成方式 。这将需要在您的应用程序中完成,而不是在 Tomcat.

新的 cookie 处理器不允许域以 . (点)。调整您的 cookie(如果可能)以使用不同于该值的值来解决此问题,而无需恢复到旧的、遗留的 cookie 处理器。

还有,应该很明显,但是我没看到上面说的:更新context.xml文件后,需要重启Tomcat 服务使更改生效。

干杯!

tomcat 版本 < 8.5.47 中的 SameSite 问题已解决

在 Tomcat 8.5.47 和以下(Tomcat 8 个版本)中,设置 CookieProcessor 标签以在 context.xml 中启用相同的站点(如下所示)不会由于 Tomcat.

中的错误而工作
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" sameSiteCookies="none" />

如果您发现在这种情况下立即升级 tomcat 不是一件容易的事(我最近遇到过),或者如果您发现任何其他情况只需要在 cookie 中进行自定义处理;您可以编写自己的 CookieProcessor class 来绕过。

请查找自定义 CookieProcessor 实施及其部署步骤的详细信息 here

在我的例子中,我写了一个基于 LegacyCookieProcessor 源代码的自定义 CookieProcessor,允许 tomcat 8.5.47 在 cookie 中启用 SameSite 属性。