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

27

我的代码在 Tomcat 8 版本 8.0.33 上运行正常,但在 8.5.4 上出现以下错误:An invalid domain [.mydomain] was specified for this cookie.

我发现在 Tomcat 8 的最新版本中引入了 Rfc6265CookieProcessor。

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

请告诉我如何进行操作,谢谢。


接受的答案是有效的,但并非在所有8.0.x版本的Tomcat上都有效。在8.0.28下测试时它无法工作,但在8.0.53上可以工作。 - BillRobertson42
6个回答

32

请参考我的答案解决方案 @Fonexn - IamVickyAV

15

情况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>

当您在独立的Tomcat中部署应用程序时,您放置在META-INF文件夹下的context.xml文件将覆盖tomcat/conf/context.xml中给出的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());
                }
            });
        }
    };
}

我正在尝试使用Case 2做同样的事情,但似乎对我没有起作用。 虽然Case 1运行良好。Case 2中提供的解决方案是否适用于任何人? Tomcat版本:8.5.69 Spring webmvc - Lavish

11
启用先前版本Tomcat使用的LegacyCookieProcessor解决了我的应用程序问题。如linzkl所述,Apache网站的https://tomcat.apache.org/tomcat-8.0-doc/config/cookie-processor.html中有说明。
原因是新版Tomcat不理解正在使用的Cookie域名前面的点(.)。
此外,在使用Internet Explorer时,请务必检查本帖。 显然,它很可能会破坏。
您可以在以下路径中找到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>

4
问题仍然存在于Tomcat9中。对于Tomcat 9,需要遵循相同的过程来设置类。 在context.xml文件中添加类。 如果您正在使用eclipse运行应用程序,则需要在服务器文件夹中的context.xml文件中进行设置。请参考下面的屏幕截图获取更多参考信息。

enter image description here

希望这能帮助到某人。

3

Tomcat版本<8.5.47的SameSite问题已解决

在Tomcat 8.5.47及以下版本(Tomcat 8版本)中,由于Tomcat中的一个错误,将CookieProcessor标签设置为启用同站点(如下所示)在context.xml中无效。

<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" sameSiteCookies="none" />

如果你面临不能立即升级tomcat的情况(最近我也遇到了这种情况),或者你需要在cookie中进行自定义处理,你可以编写自己的CookieProcessor类来解决问题。
请在此处找到自定义CookieProcessor实现和部署步骤的详细信息。
在我的情况下,我基于LegacyCookieProcessor源代码编写了一个自定义的CookieProcessor类,使得tomcat 8.5.47能够启用cookie中的SameSite属性。

您发布的链接无法访问。 - BillRobertson42

1
正如@atul所提到的,这个问题在Tomcat 9中仍然存在。由于这是新标准,未来所有版本的Tomcat都很可能会继续存在这个问题。
使用旧版cookie处理器(通过在context.xml文件中添加上述行)对我们很有效。然而,真正的“修复”应该在第一时间就调整cookie的形式。这需要在您的应用程序中完成,而不是在Tomcat中完成。
新的cookie处理器不允许域名以点(.)开头。如果可能的话,调整cookie以其他值开头即可解决此问题,而无需恢复到旧的cookie处理器。
还有,显而易见的是,但我没有在上面看到它被提到:更新context.xml文件后,您需要重新启动Tomcat服务才能使更改生效。
干杯!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接