【精选】vue + springboot前后端分离跨域cookie 您所在的位置:网站首页 vue跨域获取cookie 【精选】vue + springboot前后端分离跨域cookie

【精选】vue + springboot前后端分离跨域cookie

2023-10-27 14:27| 来源: 网络整理| 查看: 265

问题

前后端分离,请求后端的时候直接请求后端url发现每次请求的sesssionid都不一样,导致缓存数据获取失败

使用 webpack-dev-server进行开发时,webpack启动了一个运行在 node 上的 web 服务器,此时开发环境访问对应的端口时 (以 8080 举例) ,浏览器返回的 vue 页面是 webpack处理后的结果。

跨域。简单来说,在使用 ajax 请求与当前页面不同来源的数据时,浏览器会拦截服务器发回的响应。在开发环境下,“当前来源”就是 http://127.0.0.1:8080,向任何其它地址或端口的请求都会被视作跨域,从而被浏览器拦截。

webpack-dev-server 的 proxy 是为了简化开发环境下的跨域请求配置。在上述情景中,注意被拦截的是发往“其它来源”的请求,而发往“当前来源”的不会被拦截,此处的“当前来源”则是作为开发服务器的 webpack。webpack的思路就是基于此的,当发现符合在 devServer proxy 中配置好的请求格式时,将该请求拦截下来,由自己去请求服务器获取响应,然后把该响应返回给前端页面,即相当于一个传话筒。

编译打包后,前端页面成为了单独的静态资源,webpack-dev-server被抽离出去了。但是资源要被访问,那必然还是需要有另一个 web 服务器来装载它,这个服务器常见的就是 nginx。所以,如果想要让线上的 vue 页面也能正常访问服务器,那么只需要配置 nginx,告诉它同样的事,即“当我访问某个 url 时,由你来做实际的请求,然后把结果告诉我”。

解决方法 一、axios设置baseurl(后端服务地址)以及跨域带cookie 1、前端部分

axios设置config的baseurl为后端服务器的访问地址

同时在vue引入axios的位置添加以下代码,否则会出现每次访问后端cookie中的sessionid不一样

import axios from 'axios' axios.defaults.withCredentials = true;// 允许跨域携带cookie  2、后端过滤器配置允许跨域 response.setHeader("Access-Control-Allow-Origin",request.getHeader("Origin"));//支持跨域请求 response.setHeader("Access-Control-Allow-Methods", "*"); response.setHeader("Access-Control-Allow-Credentials", "true");//是否支持cookie跨域

注意:设置了axios.defaults.withCredentials = true;之后依然没有带上cookie信息,在chrome 80版本之后,谷歌把cookie的SameSite属性,从None改成了Lax。这时候,会导致cookie因为跨站而导致不会自动带上!所以需要后台在请求返回的时候 添加设置SiteSame 属性为 None

SiteSame 介绍

最新的chrome,设置null会默认成lax吧。但是如果设置samesite为NONE,又需要设置secure。https支持secure,http不行。samesite设置为null,确实去到浏览器默认就是Lax,就像domain一样,默认不设置,默认就是当前接口的domain。 这个问题最好的解决方法还是前端那边用vue配置webpack,或者nginx之类的,从协议,域名,端口上保持一致,就不存在任何跨域问题了

修改SiteSame值

Cookie c = new Cookie("SameSite", "None");

response.addCookie(c);

或者

response.setHeader(HttpHeaders.SET_COOKIE, "SameSite=None; Secure");

spring boot 配置

org.springframework.session spring-session-core 2.5.2 import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.session.web.http.CookieSerializer; import org.springframework.session.web.http.DefaultCookieSerializer; @Configuration public class SpringSessionConfig { @Bean public CookieSerializer httpSessionIdResolver() { DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer(); // 取消仅限同一站点设置 cookieSerializer.setSameSite(null); return cookieSerializer; } }

如果是使用了shiro-spring, CookieSerializer 就不起作用了,修改使用shiro的设置

org.apache.shiro shiro-spring 1.5.2 @Bean public SimpleCookie sessionIdCookie() { SimpleCookie simpleCookie = new SimpleCookie(); simpleCookie.setName("shiroSessionId"); simpleCookie.setHttpOnly(true); simpleCookie.setSameSite(Cookie.SameSiteOptions.NONE); return simpleCookie; } 二、可以通过Nginx的代理来实现 1、设置代理 server { listen 8082; //访问端口 server_name localhost; location / { root D:/dist; //前端打包项目 index index.html index.htm; } location /api { //代理拦截 proxy_pass http://localhost:8080/api } } 2、后端过滤器配置允许跨域


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有