点滴记录_关于cookie的携带

506 阅读4分钟

写在前面

  • 使用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必须在前后端都被配置(即the Access-Control-Allow-Credentials header 和 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,嗨起!