时间:2024-12-07 17:31
人气:
作者:admin
同源策略是由 Netscape 提出的著名安全策略,是浏览器最核心、基本的安全功能,它限制了一个源(origin)中加载文本或者脚本与来自其他源(origin)中资源的交互方式,所谓的同源就是指协议、域名、端口相同。
当浏览器执行一个脚本时会检查是否同源,只有同源的脚本才会执行,如果不同源即为跨域。
域名组成:

浏览器的同源策略,出于防范跨站脚本的攻击,禁止客户端脚本(如 JavaScript)对不同域的服务进行跨站调用(通常指使用 XMLHttpRequest 请求)。
(1)创建XMLHttpRequest 对象。
(2)使用open方法设置请求的参数。open(method, url, 是否异步)。
(3)发送请求。
(4)注册事件。 注册onreadystatechange事件,状态改变时就会调用。
(5)获取返回的数据,更新UI。
原理就是利用了 script 标签不受同源策略的限制,在页面中动态插入了 script,script 标签的 src 属性就是后端 api 接口的地址,并且以 get 的方式将前端回调处理函数名称告诉后端,后端在响应请求时会将回调返还,并且将数据以参数的形式传递回去。
前端:
var script = document.createElement('script');
script.src = 'http://127.0.0.1:2333/jsonpHandler?callback=_callback';
document.body.appendChild(script);
var _callback = function(obj) {
for(key in obj) {
console.log('key: ' + key +' value: ' + obj[key]);
}
}
后端:
[HttpGet]
[Route("jsonpForVue")]
public void GetjsonpForVue(string callback)
{
TokenModelJwt tokenModelJwt=new TokenModelJwt(){
Role="admin",
Uid=1,
Work="dsdf"
};
//string call = "({" + response + "})";
string response = string.Format("\"name\":\"{0}\"", "zhagnsan");
var modlestr = JsonConvert.SerializeObject(tokenModelJwt);
string call = callback + "(" + modlestr + ")";
Response.WriteAsync(call);
}
劣:
优:
跨域是浏览器禁止的,服务端并不禁止跨域

所以浏览器可以发给自己的服务端然后,由自己的服务端再转发给要跨域的服务端,做一层代理。
前端:
proxy: {
// 配置多个代理
"/api": {
target: "http://localhost:5000",//这里改成你自己的后端api端口地址,记得每次修改,都需要重新build
//target: "http://localhost:58427",
//target: "http://api.douban.com",
ws: true,
changeOrigin: true,
pathRewrite: {
// 路径重写,
"^/apb": "" // 替换target中的请求地址
}
}

缺点:不能用在生产环境,只能在开发环境;
优点:dev环境配置很简单,支持多个域名;
CORS是一种允许当前域(origin)的资源被其他域(origin)的脚本请求访问的机制。
当使用 XMLHttpRequest 发送请求时,浏览器如果发现违反了同源策略就会自动加上一个请求头 origin,后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin,值就是发起请求的源地址(http://127.0.0.1:8888),浏览器得到响应会进行判断 Access-Control-Allow-Origin 的值是否和当前的地址相同,只有匹配成功后才进行响应处理。
简单请求
复杂请求
后端配置
缺点:
优点:
概念:nginx解决跨域 是利用其反向代理的能力
Brower =》 host =》 nginx =》 目标地址服务器数据 =》 nginx =》 Brower
也就是说,nginx并不是通过监听brower的请求。而是作为一个服务器,接收外部对本机的请求。所以是先通过host,让请求指向本机,才会经过nginx。才能进行转发。
server {
listen 1005;
server_name localhost;
location / {
root nuxt\Blog.Admin\dist;
index index.html index.htm;
}
location /api {
rewrite ^.+apb/?(.*)$ /$1 break;
include uwsgi_params;
proxy_pass http://localhost:1004; #// 这是 netcore 端口
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
缺点:
优点:
WebSocket是一种通信协议,使用ws://(非加密)和wss://(加密)作为协议前缀。该协议不实行同源政策,只要服务器支持,就可以通过它进行跨源通信。
核心代码:
var ws = new WebSocket('wss://echo.websocket.org'); //创建WebSocket的对象。参数可以是 ws 或 wss,后者表示加密。
//把请求发出去
ws.onopen = function (evt) {
console.log('Connection open ...');
ws.send('Hello WebSockets!');
};
//对方发消息过来时,我接收
ws.onmessage = function (evt) {
console.log('Received Message: ', evt.data);
ws.close();
};
//关闭连接
ws.onclose = function (evt) {
console.log('Connection closed.');
};
