我们一直在使用tomcat jvmroute属性来支持会话亲和性(是的,我们希望在某个时候离开它)。
当我使用spring boot 1.3.7时,jvmroute值会附加到jsessionid(仍然使用tomcat 8.x)。但由于某种原因,春季启动1.4.0并没有。
我很确定这不是一个tomcat问题,因为即使我降级到tomcat 7,这仍然无法工作。另外,我已经调试了apache StandardEngine类并且可以看到jvmroute在tomcat 8.x中应用的属性。但不知何故,jseesionid cookie在spring boot 1.4.0中没有得到正确的值。
@SpringBootApplication
@RestController
public class TomcatJvmrouteApplication {
public static void main(String[] args) {
System.setProperty("jvmRoute", "testjvmroute");
SpringApplication.run(TomcatJvmrouteApplication.class, args);
}
@RequestMapping("/info")
public String getInfo(@Value("${jvmRoute}") String route, HttpSession session,
@CookieValue("JSESSIONID") String cookie) {
String jsessionId = cookie == null ? "" : new String(cookie.getBytes());
return "Jvmroute should be: " + route + " <br/> Jsessionid is:" + jsessionId;
}
}
Project pom:
public static void main(String[] args) {
System.setProperty("jvmRoute", "testjvmroute");
SpringApplication.run(TomcatJvmrouteApplication.class, args);
}
@RequestMapping("/info")
public String getInfo(@Value("${jvmRoute}") String route, HttpSession session,
@CookieValue("JSESSIONID") String cookie) {
String jsessionId = cookie == null ? "" : new String(cookie.getBytes());
return "Jvmroute should be: " + route + " <br/> Jsessionid is:" + jsessionId;
}
答案 0 :(得分:1)
这是spring boot 1.4.0中的一个错误,请看这个问题: https://github.com/spring-projects/spring-boot/issues/6679
这是Andy Wilkinson发布的1.4.0解决方法。只需将此bean添加到您的应用程序上下文中。
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return (container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container).addContextCustomizers((context) -> {
context.addLifecycleListener((event) -> {
if (event.getType().equals(Lifecycle.START_EVENT)) {
((Context) event.getSource()).getManager().getSessionIdGenerator()
.setJvmRoute(((ManagerBase) context.getManager()).getJvmRoute());
}
});
});
}
};
}
答案 1 :(得分:0)
我正在使用Spring Boot 2.0.4。我必须这样做:
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> servletContainer() {
return (tomcat) -> {
tomcat.addContextCustomizers((context) -> {
Manager manager = context.getManager();
if (manager == null) {
manager = new StandardManager();
context.setManager(manager);
}
((ManagerBase) context.getManager()).getEngine().setJvmRoute("tomcatJvmRoute");
});
};
}
我的原始answer