写在前面
-
使用vue前后分离的项目中,跨域问题采用CORS方式解决。
-
在spring-mvc中配置
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins=" http://localhost:83"
allowed-methods="GET, PUT,OPTIONS,POST,DELETE"
allow-credentials="true"
max-age="3600" />
</mvc:cors>
- 在整合Spring Security的时候,如果前端不携带cookie,那么会导致一直无法授权成功。

-
那么为什么axios没有默认带上cookie信息呢?
- 因为这里已经不是同源了,不是同一个域,就不会带上cookie信息了。
-
解决方法也简单,就是让它带上cookie

-
解决是解决了,但是有个比较烦的事。
- 解决了还有什么烦的?
- 一个项目几十个axios,一个一个去加啊,我头是真的大哦,代码还冗余。
- 那咋个弄嘛?
- 我突然想到了axios好像有拦截器,要不试一试。
-
那就试一试
拦截axios请求去携带cookie
-
可以参考axios文档:传送门
-
新建一个JS脚本,然后在你需要的页面引入即可

-
代码
;(function () { // 添加请求拦截器 axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 config.withCredentials = true return config; }, function (error) { // 对请求错误做些什么 return Promise.reject(error); }); }()) -
然后在所需的页面中引入就好了,为了代码健壮性,最好还是先引入axios

-
这样就搞定了。
- 嗯,这样写的确就只在有axios请求的页面上引入下就可以了,要简单不少。
- 对的,而且如果是vue-cli的话,只需要在入口JS文件中配置一次,然后把axios绑定到Vue上面就行了。
- 哦哦,明白了。OK,那现在走起?
- 嗯,其实还有个点。
- 什么?
- 不知道你还记得在spring-mvc中的跨域配置不?
- 怎么了?
- 你可以看一下,其中有个配置

-
是不是发现似曾相识呢?
不带cookie
以下摘录自MDN文档:
Access-Control-Allow-Credentials 响应头表示是否可以将对请求的响应暴露给页面。返回true则可以,其他值均不可以。
Credentials可以是 cookies, authorization headers 或 TLS client certificates。
当作为对预检请求的响应的一部分时,这能表示是否真正的请求可以使用credentials。注意简单的
GET请求没有预检,所以若一个对资源的请求带了credentials,如果这个响应头没有随资源返回,响应就会被浏览器忽视,不会返回到web内容。
Access-Control-Allow-Credentials头 工作中与XMLHttpRequest.withCredentials或Fetch API中的Request()构造器中的credentials选项结合使用。Credentials必须在前后端都被配置(即theAccess-Control-Allow-Credentialsheader 和 XHR 或Fetch request中都要配置)才能使带credentials的CORS请求成功。true : 这个头的唯一有效值(区分大小写)。如果不需要credentials,相比将其设为false,请直接忽视这个头
- 而我们这里使用的就是结合的请求头使用

-
而按照此说法,也就是说你需要cookie的时候,你就需要在浏览器端和服务器端都进行对应的配置。在服务器端就是我们的配置:
allow-credentials="true" -
而在浏览器端的配置就是我们以上所说的axios拦截器中的配置。
- 我去,还有这么一说哦。
- 就是呀。
- 那是不是说我不需要cookie就设置为false呢?
- 对的,如果不要它带上cookie,你就写个false就OK 了,如下:

- 或者你干脆就把红框里面的配置删掉。
- 那你的意思是说,我们直接配置false, 浏览器端也就不用做任何配置了哦。
- 对的。
- 那你扯那么多干嘛?直接说不完了?
- 但是我们使用的Spring Security是经过层层过滤后到达我们的login,但是login中其实没有认证逻辑,认证都是Spring Security帮我们干了,它在认证的过程中是需要cookie来进行认证的。只不过我们没有参与,也就没有去操作cookie。
- 哦哦,原来如此,也就说我们还是需要把allow-credentials设置为true哦?
- 对的。
- 那你又扯那么多废话干嘛,上号上号。
- 那你给点个赞啊。
- 哎呀,好的,真烦,已经点了赞了。
- OK,嗨起!