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

时间:2016-08-01 10:03:22

标签: java cookies tomcat8

我的代码正在使用tomcat 8版本8.0.33但是在8.5.4我得到: 为此cookie指定了无效的域[.mydomain]。

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

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

请让我知道如何做到这一点。

由于

6 个答案:

答案 0 :(得分:18)

您可以在context.xml中尝试

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

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

答案 1 :(得分:8)

启用早期版本的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>

答案 2 :(得分:2)

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 实现及其部署步骤的详细信息 here

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

答案 3 :(得分:1)

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

将类添加到context.xml文件中。

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

enter image description here

希望这对某人有帮助。

答案 4 :(得分:1)

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

请在answer后面加上@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());
                }
            });
        }
    };
}

答案 5 :(得分:1)

如@atul所述,此问题在Tomcat 9中仍然存在。由于这是新标准,因此很可能会在所有将来的Tomcat版本中继续向前发展。

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

新的Cookie处理器不允许域以开头。 (点)。调整Cookie(如果可能的话)以一个不同于该值的值开头,将解决此问题,而无需使用旧的旧Cookie处理器。

这也应该很明显,但是我上面没有看到它:更新 context.xml 文件后,您需要重新启动Tomcat服务以使更改生效。 / p>

干杯!