使用Tomcat 9.0.13,在rhel 7上运行的openJDK8。
我们的应用程序过去曾在Websphere上运行,其中可以使用CloneSeparatorChange指定会话路由分隔符。 JSESSIONID存储在设置为Secure和HttpOnly的cookie中。
Tomcat通常使用“。”作为JSESSIONID和jvmRoute(在Websphere世界中为CloneID)之间的分隔符,但是我们的代码期望在Websphere中设置“:”。
我的问题:有没有办法将会话ID分隔符从“”更改为。换一个字符,说“:”?
答案 0 :(得分:1)
jvmRoute由SessionIdGenerator Component接口的实现处理。 标准实现org.apache.catalina.util.StandardSessionIdGenerator没有提供一种方法来配置用于将jvmRoute添加到JSESSIONID的分隔符: https://github.com/apache/tomcat/blob/trunk/java/org/apache/catalina/util/StandardSessionIdGenerator.java#L52-L59:
if (route != null && route.length() > 0) {
buffer.append('.').append(route);
} else {
String jvmRoute = getJvmRoute();
if (jvmRoute != null && jvmRoute.length() > 0) {
buffer.append('.').append(jvmRoute);
}
}
'。字符是硬编码的,因此您不能通过配置对其进行更改。 幸运的是,您可以配置用于生成SessionId的类:
我的建议是扩展StandardSessionIdGenerator类,通过调用super方法并替换字符来覆盖generateSessionId。
class CustomSessionIdGenerator extends StandardSessionIdGenerator{
@Override
public String generateSessionId(String route) {
String sessionId = super(route);
return sessionId.replace('.',':');
}
}
然后,您可以在tomcat的配置文件(例如context.xml)的Context组件内的Manager组件中配置CustomSessionIdGenerator类。