SpringBoot Ajax跨域请求sessionId
0
最经做一个功能时发现Ajax跨域并不能上送sessionId,每次请求sessionId都不一样,就是sessionId改变了,所以研究了一下。
解决办法如下:
添加SpringBoot跨域配置:
@Configuration
class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("https://testjd.com:8080", "https://testtaobao.com:8080")
.allowCredentials(true)
.allowedHeaders("*")
.allowedMethods("*")
.maxAge(1800);
}
}
Ajax添加Cookie配置withCredentials:
$.ajax({
"xhrFields" : {
withCredentials : true
},
url : "https://testjd.com:8080",
success : function(message) {
alert(message);
}
});
火狐浏览器上面配置就已经可以实现要求了,但是Chrome却不行。
原来Chrome还需要配置SameSite和Secure,所以必须设置SSL才可以。
生成证书:
keytool -genkey -alias tomcat -keyalg RSA -keystore tomcat.jks -keysize 2048 -storetype JKS -validity 3650
配置证书:
server.ssl.key-store=classpath:tomcat.jks
server.ssl.key-store-password:123456
server.ssl.keyStoreType:JKS
server.ssl.keyAlias:tomcat
配置SameSite:
@Configuration
class TomcatConfiguration {
@Bean
public TomcatContextCustomizer sameSiteCookiesConfig() {
return context -> {
final Rfc6265CookieProcessor cookieProcessor = new Rfc6265CookieProcessor();
cookieProcessor.setSameSiteCookies(SameSiteCookies.NONE.getValue());
context.setCookieProcessor(cookieProcessor);
};
}
}
有了上面的配置Secure可以不用配置,也可以配置:
server.servlet.session.cookie.secure=true