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

Posted

技术标签:

【中文标题】如何在 tomcat 8 中将 Cookie 处理器更改为 LegacyCookieProcessor【英文标题】:How to change Cookie Processor to LegacyCookieProcessor in tomcat 8 【发布时间】:2016-12-06 08:53:41 【问题描述】:

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

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

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

请告诉我该怎么做。

谢谢

【问题讨论】:

【参考方案1】:

你可以在 context.xml 中试试

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

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

【讨论】:

参考我的答案@Fonexn【参考方案2】:

启用在以前版本的 Tomcat 中使用的 LegacyCookieProcessor 已经解决了我的应用程序中的问题。正如 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>

【讨论】:

【参考方案3】:

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

在 context.xml 文件中添加类。

如果你使用eclipse运行应用程序,需要在服务器文件夹中的context.xml文件中设置。请参阅下面的屏幕截图以获取更多参考。

希望这对某人有所帮助。

【讨论】:

【参考方案4】:

案例 1: 您正在使用 独立 Tomcat 并且 有权访问 来更改 Tomcat 服务器中的文件

请通过@linzkl 关注answer

案例 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:您正在使用 Embedded 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());
                
            );
        
    ;

【讨论】:

【参考方案5】:

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

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

新的 cookie 处理器不允许域以 . (点)。调整您的 cookie(如果可能)以其他值开始将解决此问题,而无需恢复到旧的遗留 cookie 处理器。

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

干杯!

【讨论】:

【参考方案6】:

tomcat 版本

在 Tomcat 8.5.47 及以下版本(Tomcat 8 版本)中,由于 Tomcat 中的错误,在 context.xml 中设置 CookieProcessor 标记以启用同一站点(如下所示)不起作用。

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

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

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

就我而言,我基于LegacyCookieProcessor 源代码编写了一个自定义CookieProcessor,它允许tomcat 8.5.47 在cookie 中启用SameSite 属性。

【讨论】:

以上是关于如何在 tomcat 8 中将 Cookie 处理器更改为 LegacyCookieProcessor的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tomcat 6 中将会话 cookie 标记为安全(仅限 https)

在 Tomcat 8 中将外部资源添加到类路径

如何在 AWS Elastic Beanstalk 环境中将 Tomcat 的 URIencoding 设置为 UTF8?

如何在 typescript 中将 cookie jar 添加到 axios?

如何在 ASP.NET 中将 SameSite cookie 属性减少回无?

两台WEB服务器,一台TOMCAT,一台IIS,路由中把80端口映射到TOMCAT上,如何在TOMCAT中将指定网址转到IIS上