最近被跨域问题搞得头疼了很久,今天终于搞明白了,记录下来以备今后查看。
对于前后端分离项目,基本上都会遇到跨域问题,所谓的跨域问题就是指前端和后端部署的站点不一致,如果不做配置前端发起请求就会被浏览器阻断禁止访问。需要前端和后端都做相应配置才可以正常通信。关于配置网上很多,以前端通过axios通信为例,增加axios.defaults.withCredentials = true这么一条就行了,后端以laravel配置为例:
public function handle($request, Closure $next)
{
$response = $next($request);
$response->header('Access-Control-Allow-Origin', '$request->header("Origin")'); //这里前端配置withCredentials = true就不能用“ * ”号
$response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, Accept');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
$response->header('Access-Control-Allow-Credentials', 'true'); //和前端对应后端也得将Credentials设置为true
return $response;
}
就是在响应头里提前加这么一些配置,如果你启用了Fruitcake\Cors中间件,只需要配置相应的cors.php配置文件就行,和上面效果一样。
但是光做这些设置还是解决不了跨域cookie保存问题,也就是说:前端在申请访问时,后端可以正常返回信息,并且也可以携带cookie你通过浏览器查看网络文件头也有set-cookie字段,但是在浏览器本地存储是不记录cookie的,即set-cookie失效,后端过来的cookie值不能写入前端,自然前端也无法读取后端响应的cookie内容。网上有说需要更改session设置,将session.php配置文件中的session_domain域设置为前端所在的域就行了,也有说设置为前端的ip地址就行,方法都试过了,依旧不能保存cookie。
后来查了很多资料,发现前后端完全不同域下进行cookie共享行不通,至少我是没能解决,但是在一级域名一致,二级域名不同的情况下,是可以支持cookie保存的,于是我做了如下配置:
后端服务端在ubuntu上配置/etc/hosts文件,增加
后端服务器ip aa.xx.com
前端服务器ip bb.xx.com
前端服务器在windows+nodejs上,配置才c:/windows/system32/drivers/etc/hosts ,增加同上内容
然后修改session的配置文件,将session_domain 配置为.xx.com(这里注意xx前有一个点)一级域
配置完后,终于解决了前后端分离情况下跨域通信可将cookie正常保存到本地问题。
本文介绍了前后端分离项目中解决跨域问题的方法,并详细解释了如何配置才能使跨域情况下的Cookie正常保存及读取。
1907

被折叠的 条评论
为什么被折叠?



