赞
踩
由于浏览器的同源策略限制,同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互
同源策略(Sameoriginpolicy)是一种约定,同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port),是浏览器最核心也最基本的安全功能
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
| 当前页面url | 被请求页面url | 是否跨域 | 原因 |
|---|---|---|---|
| http://www.lluozh.com/ | http://www.lluozh.com/index.html | 否 | 同源(协议、域名、端口号相同) |
| http://www.lluozh.com/ | https://www.lluozh.com/index.html | 跨域 | 协议不同(http/https) |
| http://www.lluozh.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(lluozh/baidu) |
| http://www.lluozh.com/ | http://blog.lluozh.com/ | 跨域 | 子域名不同(www/blog) |
| http://www.lluozh.com:8080/ | http://www.lluozh.com:5001/ | 跨域 | 端口号不同(8080/5001) |
跨域文件上传的时候,浏览器会自动发起一个OPTIONS方法到服务器,现在后台解决前端跨域跨域请求的问题
客户端发起的这个OPTIONS可以说是一个"预请求",用于探测后续真正需要发起的跨域POST请求对于服务器来说是否是安全可接受的,因为跨域提交数据对于服务器来说可能存在很大的安全问题
请求头Access-Control-Request-Method用于提醒服务器在接下来的请求中将会使用什么样的方法来发起请求
Access-Control-Allow-Method和Access-Control-Allow-Origin分别告知客户端,服务器允许客户端用于跨域的方法和域名
flask_cors 包pip install flask-cors
from flask_cors import *
app = Flask(__name__)
CORS(app, supports_credentials=True)
现在我们看看解决问题的实际案例
from flask_cors import CORS
app = Flask(__name__,)
# r'/*' 是通配符,让本服务器所有的URL 都允许跨域请求
CORS(app, resources=r'/*')
# 上传文件
@uploadFiles.route('/upload', methods=['POST'])
def uploadFile():
result_text = {"statusCode": 200,"message": "文件上传成功"}
response = make_response(jsonify(result_text))
response.headers['Access-Control-Allow-Origin'] = '*'
response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,HEAD,GET,POST'
response.headers['Access-Control-Allow-Headers'] = 'x-requested-with'
return response
使用POSTMAN请求
由于项目中路由是多级路由,通过主路由跳转到子路由,一开始的时候,允许跨域的配置在上传文件的子路由中进行设置,发现OPTIONS请求响应值中并没有返回预期的头文件,将跨域设置在主路由中设置即可
欢迎关注个人公众号

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。