浏览器跨域访问安全问题

1、问题描述:
首先在后台实现一个get1的响应,然后在本地浏览器访问,如图所示:
在这里插入图片描述
然后再启动一个服务,端口设为8081,然后在本地浏览器访问此IP,如果在此IP里访问端口为8080的IP时,会出现跨域问题,如图所示:
在这里插入图片描述
在这里插入图片描述
2、产生跨域问题的原因:
1)浏览器限制。跨域的根本原因在于浏览器在前台做的限制。
2)跨域。包括协议、域名和端口。
3)发送的是xhr(XMLHTTPRequest)请求。
三个条件缺一不可

3、解决思路:

  • 浏览器禁止检查(意义不大)
  • 不发送xhr,可以发送json
  • 实现跨域,即对于浏览器来说,看起来没有跨域

4、跨域的实现
1)在浏览器启动的时候附加参数,–disable-web-security

chrome --disable-web-security --user-data-dir=f:\temp

2)jsonp:json for padding,在发送请求的时候,指定数据类型为jsonp,如果服务器端有callback标记,就会返回script类型文件,底层是在响应请求的时候,在html中创建script标签。至于callback标记,仅仅是一种约定,是可替换的。比如可以替换成callback2,此时要在发送请求时,指定jsonp属性为callback2。

发送xhr请求,会响应json数据类型;发送jsonp请求,会响应script数据类型。

jsonp实现跨域的弊端:

  • 服务器端需要代码支持
  • 只支持Get请求
  • 发送的不是xhr请求

3)跨域解决方向

  • 被调用方解决跨域
    修改被调用方后台代码
  • 调用方解决跨域
    修改调用方后台代码
    在这里插入图片描述

被调用方解决跨域方法:
1)修改应用服务器端代码,添加响应头的属性。

  Access-Control-Allow-Methods: Get
  Access-control-Allow-origin: http://localhost:8081

注意: * 表示允许所有的跨域

简单请求:方法为get、post、head
非简单请求:发送json格式的ajax请求

浏览器中添加cookie的方式:

document.cookie="xxx=xxx"

2)配置Nginx或者Apache,在http服务器中修改响应头。

调用方解决跨域方法:

隐藏跨域,通过调用方和被调用方http服务器的反向代理,即配置Nginx或者Apache。下面是Nginx配置文件。

server{
  listen 80;
  server_name a.com
  
  location /{
  	proxy_pass http://localhost:8081;
  }
  
  location /ajaxserver{
  	proxy_pass http://localhost:8080/test
  }
}
发布了10 篇原创文章 · 获赞 1 · 访问量 2317

猜你喜欢

转载自blog.csdn.net/qq_35334269/article/details/105391463