解决浏览器跨域问题
解决浏览器跨域问题
前后端分离的项目中,由于前端所运行的域名地址与后端常常不一致,在发送ajax时,我们常常会碰到跨域问题。
这是浏览器制定的安全策略(同源策略Same origin policy),浏览器跨域名请求数据时,需要响应数据中包含对应的响应头表示同意这个异端请求拿取我们服务端的数据。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10。
整个CORS通信过程,都是浏览器自动完成,不需要用户参与。对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样。浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉。
因此,实现CORS通信的关键是服务器。只要服务器实现了CORS接口,就可以跨源通信。
两种请求分类
-
简单请求:属于
HEAD\GET\POST
请求的一种,并且头的信息不超过以下几种:Accept Accept-Language Content-Language Last-Event-ID Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
简单请求只要求响应头信息之中增加一个Origin字段。
-
非简单请求:其余的都算非简单请求。
要求发送两次请求,第一次请求是OPTIONS请求,其目的是preflight预检。
简单粗暴的加响应头
在遇到跨域响应被浏览器检查时,会抛异常告诉我们需要加一些响应头,那么常用解决跨域的响应头是使用以下几个:
headers={
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Content-Type', # 用axios发送请求时可能要添加这个头
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS' # 一些请求方式,不确定是否有用
}
django项目解决方案
目前成熟的主流方案,使用django-cors-headers包:
pip install django-cors-headers
在Django的设置文件中添加corsheaders应用程序和中间件:
# 注册软件
INSTALLED_APPS = [
# ...
'corsheaders',
# ...
]
# 注册中间件
MIDDLEWARE = [
# ...
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
# ...
]
-
添加以下配置项以允许所有跨域请求:
CORS_ORIGIN_ALLOW_ALL = True
-
只允许指定的源访问跨域请求:
将配置项改为False:CORS_ORIGIN_ALLOW_ALL = False
并添加以下配置项:# 允许跨域的域名白名单 CORS_ORIGIN_WHITELIST = [ 'http://localhost:3000', 'https://example.com' ] # 配置允许的请求方式 CORS_ALLOW_METHODS = ( 'DELETE', 'GET', 'OPTIONS', 'PATCH', 'POST', 'PUT', 'VIEW', ) # 可以自定义响应头 CORS_ALLOW_HEADERS = ( 'XMLHttpRequest', 'X_FILENAME', 'accept-encoding', 'authorization', 'content-type', 'dnt', 'origin', 'user-agent', 'x-csrftoken', 'x-requested-with', 'Pragma', 'token' )
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示