最近尝试使用spring boot只提供RestAPI服务,做前后端分离。那么前端代码就和后端代码不在同一个域下,会有跨域问题。网友遇到的类似问题:

1 Spring boot2.0+vue1.* 跨域seesion丢失问题:

    http://www.oschina.net/question/2241624_2232412

    https://segmentfault.com/q/1010000008298658

 Spring Boot+AngularJS中因为跨域导致Session丢失

    在我们每一次的数据请求中,浏览器都会向后台发送一个JSession,后台会根据这个值自动查找Id为JSession的那个session对象。但是当跨域时,JSession的值每次都会改变,后台就会以为是新的一个会话打开,于是又去创建了一个新的Session对象,而原来的Session对象就找不到了。

 

解决办法都提到了:withCredentials。跨域时可能需要设置 withCredentials

withCredentials是啥?

http://blog.sina.com.cn/s/blog_687e21950101gpoj.html

http://newhtml.net/using-cors/

但是支持withCredentials的浏览器兼容型不够好,兼容withCredentials属性的浏览器有Firefox 3.5+、Safari 4+和Chrome。IE10及更早版本都不支持(但是我测试IE10是可以的)。

而且这样做的话,每个http头都多了sessionid。如果token只存储sessionid的话,并不比token的方式节省多少流量。

 我也使用了withCredentials,确实解决了跨域session重新生成的问题。可是浏览器兼容性无法保证。而且使得ajax请求不那么便捷,得小心翼翼地写代码。有没有更好的办法呢?

 

用nginx反向代理可以解决,在生产环境下没问题,但是开发环境下反向代理不是很方便。

 

 

 

关于sessionid失效的一些情况:

1 集群服务器时间不一样,导致在某些服务器

导致 doValidate(session);出现异常,执行了onExpiration(session, ese, key);,该方法执行了deleteMe,导致会生成新的sessionId。

http://www.cnblogs.com/binv5/p/6305826.html

 

2请求的时候url多了个斜杠。http://172.31.60.117:8088//mslogin/view/login.jsp;

http://www.xue163.com/2096/1/20962184.html

 

 

于是决定用spring session 通过x-auth-token的方式代替通过cookie的方式.

但是跨域时候:跨域的只能获取Content-type这个怎么破?xhr.getResponseHeader('some_header')只能获取Content-type。

这时需要设置

corsConfiguration.addExposedHeader("x-auth-token");就好了。



但是cors的方式终究不太安全。
生产环境下部署的时候还是改回nginx的方式了