1.首先要了解什么叫跨域?跨域和不跨域有什么区别
1,首先什么叫“域”?
故名思意就是区域的意思,假设现在有三台服务器A(http://66.66.66.66:8081),
B(http://66.66.66.66:8082),C(http://77.77.77.77:8081);场景:A是一台展示你登录微信界面的服务器,
B是一台验证你登录微信的服务器,C是一个看小视频的服务器;
2,A,B,C的端口,协议,ip都不相同所以把它们分为三个区域,参考浏览器的
同源策略(https://developer.mozilla.org/zh-CN/docs/Web/Security/Same-origin_policy)
3,如果是跨域请求,浏览器内核默认不会携带cookie;
cookie:在浏览器端存储信息的一块内存
response.addCookie(new Cookie("myCookie",“123456”))----后端在请求头中增加了一个header:"set-Cookie"
Cookie参数有:
Name:myCookie
Value:123456
Domain:localhost //作用域范围
Path :/data //前端发生请求时的路径中包含/data就会去cookie存储区拿到cookie值并携带
(浏览器内核的默认操作。发生在非跨域请求,或跨域请求允许携带cookie时)
Expires:Thu, 19 Sep 2019 01:36:08 GMT //过期时间
HttpOnly:false //是否允许前端通过js得到
Secure:false //规定是否通过安全的 HTTPS 连接来传输 cookie。
2.跨域产生初识
现在你在A服务上填写你的 用户名+密码 点击登录 发送请求到B服务器,这就产生了跨域请求。
3.为什么有跨域概念?它干了什么?
1.前端向后台发送请求的几种方式:
1.1,通过表单提交参数(form表单)
<form action="" method="post">
用户名:<input type="text" name="username"/><button>提交</button>
</form>
1.2,通过链接提交参数(a标签)
<a href="">删除</a>
1.3,通过js提交参数(xmlHttpRequest方式,包括很多框架,其实都封装了xmlHttpRequest方式;如Ajax,axio等)
<input type="text" name="username"/><button onclick="fn()">发送请求</button>
1.4,通过script发送请求
<script src="http://example.com/index.php?arg=val1&jsonp=callback"/>
1.5,通过link发送请求
<link rel="stylesheet" href="...">
2.说跨域为什么要扯到前端发送请求的几种方式?
在发送请求的时候浏览器内核会解析html标签,当遇到XMLHttpRequest请求时,常用的Ajax,为了安全考虑它会特别“警惕”,
首先它会判断你的请求是否跨域(A--访问B就产生跨域),如何跨域它会在你的请求头中加上Origin字段来表明本次请求
是跨域并且我是A;其次它会判断当前请求是“简单请求”还是“复杂请求”(先看完下面:两种请求)如果是“简单请求”直接发送
本次请求,如果是“复杂请求”:
它会发送一次预请求,请求的方法方法名为OPTIONS,请求的主要头部信息有:
Access-Control-Request-Headers: content-type,token //我想发送一次跨域请求,请求头中字段有content-type,token
Access-Control-Request-Method: POST //我想发送一次跨域请求,请求方法是post
Origin: A //我想发送一次跨域请求,我是A
然后B收到A的预请求,如果响应结果为200就表示,A这次预请求通过,可以正式发送请求;
A收到的响应头部信息主要:
Access-Control-Allow-Headers: content-type,token //允许跨域请求的头部信息只能是content-type,token
Access-Control-Allow-Methods: GET,POST,OPTIONS,PUT,DELETE //允许跨域的方法名只能是GET,POST,OPTIONS,PUT,DELETE
Access-control-Allow-Origin: A //允许跨域的源域是A
Access-Control-Max-Age: 60*30 //允许不用发送预请求的间隔时间30分钟
Access-Control-Allow-Credentials","true" //允许携带证数(cookie)
4.两种请求;简单请求和复杂请求
1.简单请求
(1) 请求方法是以下三种方法之一:
HEAD
GET
POST
(2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
2.复杂请求(除去简单请求都是复杂请求)
如:
Request URL:www.baidu.com/user
Request Method: POST
Content-Type: application/json;charset=UTF-8
5.跨域解决了什么问题?带来什么问题?
1:如果不存在跨域
场景:用户在A上输入用户名,密码,发送请求到B上登录成功;B将登录信息生成凭证返回给A存到Cookie中,这是用户又打开非法的C网站
C网站发送非法请求给B,这时浏览器内核会去检查路径并也携带上B给A生成的凭证cookie;然后c网站就能以A网站的名义为所欲为。这就是
著名的CSRF:跨站请求伪造攻击。(浅谈csrf攻击)https://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
2:带来的问题
前后端分离的项目中;不能直接发送xmlhttprequest请求,或携带cookie;
6.如何解决跨域和跨域携带cookie
请参考我另外一篇文章:(前后端分离跨域问题)https://blog.csdn.net/qq_44742816/article/details/99485673?utm_source=app
7.以上内容为自己总结,如有错误欢迎指正,及欢迎补充。