Java 如何在tomcat 8中将Cookie处理器更改为LegacyCookieProcessor
我的代码在tomcat 8版本8.0.33上运行,但在8.5.4上我得到: 为此cookie指定了无效的域[.mydomain] 我发现在Tomcat8的最新版本中引入了RFC6265Cookie处理器 官方文件上说,这可以在context.xml中恢复为LegacyCookieProcessor,但我不知道如何恢复 请让我知道怎么做Java 如何在tomcat 8中将Cookie处理器更改为LegacyCookieProcessor,java,cookies,tomcat8,Java,Cookies,Tomcat8,我的代码在tomcat 8版本8.0.33上运行,但在8.5.4上我得到: 为此cookie指定了无效的域[.mydomain] 我发现在Tomcat8的最新版本中引入了RFC6265Cookie处理器 官方文件上说,这可以在context.xml中恢复为LegacyCookieProcessor,但我不知道如何恢复 请让我知道怎么做 谢谢您可以在context.xml中尝试 <CookieProcessor className="org.apache.tomcat.util.http.L
谢谢您可以在context.xml中尝试
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
参考:
启用以前版本的Tomcat中使用的LegacyCookieProcessor解决了我的应用程序中的问题。正如linzkl提到的,Apache的网站对此进行了解释 原因是新版本的Tomcat不理解。(点)位于正在使用的Cookie的域名前面 此外,请确保在使用Internet Explorer时进行检查。显然,它很可能会破裂 您可以在以下路径中找到context.xml tomcat8/conf/context.xml
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" />
Tomcat9仍然存在问题。Tomcat9需要遵循相同的过程来设置类
在context.xml文件中添加该类
如果使用eclipse运行应用程序,则需要在服务器文件夹的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>
WEB-INF/WEB.xml
WEB-INF/tomcat-WEB.xml
${catalina.base}/conf/web.xml
在独立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());
}
});
}
};
}
@Bean
WebServerFactoryCustomizer cookieProcessorCustomizer(){
返回新的WebServerFactoryCustomizer(){
@凌驾
void自定义(TomcatServletWebServerFactory TomcatServletWebServerFactory){
tomcatServletWebServerFactory.AddContextCustomizer(新的TomcatContextCustomizer(){
@凌驾
公共void自定义(上下文){
setCookieProcessor(新的LegacyCookieProcessor());
}
});
}
};
}
正如@atul所提到的,这个问题在Tomcat 9中仍然存在。由于这是新的标准,它很可能会在Tomcat的所有未来版本中继续前进
使用传统cookie处理器(通过将上面的行添加到context.xml文件中)对我们来说效果很好。然而,真正的“修复”是首先调整cookie的形成方式。这需要在应用程序中完成,而不是在Tomcat中
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" sameSiteCookies="none" />
新的cookie处理器不允许域以。(点)。调整cookie(如果可能)以其他值开始,将修复此问题,而不会恢复到旧的旧cookie处理器
另外,这应该是显而易见的,但我没有看到上面提到的内容:更新context.xml文件后,需要重新启动Tomcat服务,更改才能生效
干杯 tomcat版本<8.5.47中的SameSite问题已解决
在Tomcat 8.5.47和bellow(Tomcat 8版本)中,设置CookieProcessor
标记以在context.xml
中启用相同的站点(如下所示),由于Tomcat中存在错误,因此无法工作
<CookieProcessor className="org.apache.tomcat.util.http.LegacyCookieProcessor" sameSiteCookies="none" />
如果您发现在这种情况下,立即升级tomcat不是一件容易的事情(我最近遇到过这种情况),或者如果您发现任何其他情况,您只需要在cookie中进行定制处理;您可以编写自己的CookieProcessor
类来四处走动
请查找自定义CookieProcessor
实现及其部署步骤的详细信息
在我的例子中,我基于LegacyCookieProcessor
源代码编写了一个自定义CookieProcessor
,该源代码允许tomcat 8.5.47在Cookie中启用SameSite
属性。有关解决方案,请参考我的答案@Fonexn