跨域问题
一:同源策略
同源策略(Same origin policy)是一种约定,是浏览器最核心也最基本的功能,如果缺少了同源策略,则浏览器的正常功能都可能会收到影响。web是构建在同源策略基础之上的,浏览器知识针对同源策略的一种实现。
请求的url地址必须与浏览器上的url处于同域上,也就是域名,端口,协议相同
例如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据
浏览器上就会报错,个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险
已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8001/SendAjax/ 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')
但是注意:项目中的访问以及发生了,说明是浏览器对非同源请求返回的结果做了拦截。
同源策略:浏览器基本的安全策略
当前页面只能朝当前域的地址发送请求
不同的域:ip+端口+协议 三者都相同才是同一个域
二:CORS跨域资源共享
简单请求和非简单请求:
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.简单请求只发一次请求
3.非简单请求发两次:一次是OPTIONS预检请求,预检请求同意我发,我再发起第二次真实请求,一次是真实的请求以后处理跨域问题(可以用第三方的django-cors-headers)
4.写一个中间件
class MyMiddleware(MiddlewareMixin): def process_response(self,request,response): #处理了简单请求 response['Access-Control-Allow-Origin'] = '*' #处理非简单请求 if request.method=='OPTIONS': response['Access-Control-Allow-Headers']='*' # response['Access-Control-Allow-Methods']='PUT,PATCH' response['Access-Control-Allow-Methods']='*' return response -在setting中配置