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

完整项目:https://gitee.com/acgist/demo/tree/master/ajax