什么是跨域问题
最近在做一个前后端分离的项目时,需要前端向后端发起请求然后得到数据,却始终拿不到后端返回的数据,但是通过浏览器直接访问这个接口是可以得到返回的数据。这让我百思不得其解,最后通过看报错得到了如下信息:
通过百度知道这是因为浏览器的同源策略规定某域下的客户端在没明确授权的情况下,不能
读写另一个域的资源。而在实际开发中,前后端常常是相互分离的,并且前后端的项目部署也常常不在一个服务器内或者在一个服务器的不同端口下。前端想要获取后端的数据,就必须发起请求,如果不做一些处理,就会受到浏览器同源策略的约束。后端可以收到请求并返回数据,但是前端无法收到数据。
解决办法
方案1 使用make_response
具体代码如下
from flask import Flask, request, jsonify, make_response app=Flask(__name__) @app.route('/') def index(): user_count = User.query.count() data = request.args.to_dict() user_list = User.query.order_by( User.id.asc() ).paginate(page=int(data.get('page')),per_page=int(data.get('limit'))) res = make_response(jsonify( {"code":0, "msg":'', "count":user_count, "data":[{"id":user.id,"username":user.username,"password":user.password} for user in user_list.items] } )) res.headers['Access-Control-Allow-Origin'] = '*' res.headers['Access-Control-Allow-Method'] = '*' res.headers['Access-Control-Allow-Headers'] = '*' return res |
前端能够接收到返回的内容
方案2 使用CROS
首先安装flask_cors这个包 pip install flask_cors
from flask_cors import * app = Flask(__name__) CORS(app, supports_credentials=True)
@app.route('/') def index(): user_count = User.query.count() data = request.args.to_dict() user_list = User.query.order_by( User.id.asc() ).paginate(page=int(data.get('page')),per_page=int(data.get('limit'))) return jsonify( {"code":0, "msg":'', "count":user_count, "data":[{"id":user.id,"username":user.username,"password":user.password} for user in user_list.items] } ) |
总结
之所以浏览器要制定同源策略,其中一个重要的原因就是对cookie的保护。Cookie中存着sessionid,如果***获取了sessionid,在有效的时间内就能登录账号。当访问了一个恶意网站 如果没有同源策略 那么这个网站就能通过js 访问document.cookie 得到用户关于的各个网站的sessionID 其中可能有银行网站等等。
虽然有同源策略,但是不是说就绝对安全,只能说是提高了一点***的成本。
END
主 编 | 王文星
责 编 | 刘玉江
where2go 团队