因为跨域请求是不会发送cookie等用户认证凭据的到服务端的,每次请求服务端都不能拿到之前的jsessionId,会认为这是一个全新的请求,所以重新生成了一个jsessionid。
首先,客户端要开放传输cookie的认证:
XHR请求
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://example.com/', true);
xhr.withCredentials = true;
xhr.send(null);
ajax请求:
$.ajax({
url: 'http://example.com/',
xhrFields: {
withCredentials: true
},
...
});
fetch请求:
fetch(url, {
credentials: 'include' // 总是发送请求资源域在本地的 cookies、 HTTP Basic authentication 等验证信息.
})
服务端,以java为列:
Access-Control-Allow-Credentials: true // 允许credentials:
但是
到这一步还没有结束,我们为了解决跨域问题设置的Access-Control-Allow-Origin:* 报错了:
那只能动态配置当前的访客为白名单:
'Access-Control-Allow-Origin', request.get('origin')
但是
又报了一个错误,预请求options未通过,
在这里找到了有效方法是:https://www.cnblogs.com/caimuqing/p/6733405.html
if (request.getMethod().equals("OPTIONS")) {
HttpUtil.setResponse(response, HttpStatus.OK.value(), null);
return;
}
总算问题得到解决,在这里记录一下踩坑历程,可以愉快地用jsessionId作为用户单一登录凭证啦