Django cors跨域问题

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

Django cors跨域问题

前后端分离项目中的跨域问题 即同源策略
同源策略:同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏览器,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用这个策略。如果缺少了同源策略,浏览器很容易受到 XSS、 CSFR 等攻击。
同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源。
源就是协议、域名和端口号。
协议:http,https
跨域:前端请求URL的协议、域名、端口与前端页面URL不同就是跨域
在Django中解决跨域问题

一、
  1. # 1、安装第三方库 django-cors-headers
  2. # 2、在settings.py中添加'corsheaders.middleware.CorsMiddleware',在SessionMiddleware和CommonMiddleware的中间
  3. # 3、在INSTALLED_APPS里添加“corsheaders”
  4. INSTALLED_APPS = [
  5.     'search.apps.SearchConfig',
  6.     'data.apps.DataConfig',
  7.     'record_data.apps.RecordDataConfig',
  8.     'deleted_data.apps.DeletedDataConfig',
  9.     'mgmt.apps.MgmtConfig',
  10.     'c_test.apps.CTestConfig',
  11.     'rest_framework',
  12.     'django.contrib.admin',
  13.     'django.contrib.auth',
  14.     'django.contrib.contenttypes',
  15.     'django.contrib.sessions',
  16.     'django.contrib.messages',
  17.     'django.contrib.staticfiles',
  18.     'corsheaders',  # 新增
  19. ]
  20. # 4、在中间件中添加corsheaders.middleware.CorsMiddleware,django.middleware.common.CommonMiddleware
  21. MIDDLEWARE = [
  22.     # 'utils.middleware.ExceptionMiddleware',
  23.     'django.middleware.security.SecurityMiddleware',
  24.     'django.contrib.sessions.middleware.SessionMiddleware',
  25.     'corsheaders.middleware.CorsMiddleware',  # 新增/必须在common中间件上面
  26.     'django.middleware.common.CommonMiddleware',
  27.     # 'django.middleware.csrf.CsrfViewMiddleware',
  28.     'django.contrib.auth.middleware.AuthenticationMiddleware',
  29.     'django.contrib.messages.middleware.MessageMiddleware',
  30.     'django.middleware.clickjacking.XFrameOptionsMiddleware',
  31. ]
  32. # 5、在settings.py底部增加
  33. CORS_ALLOW_CREDENTIALS = True  # 允许携带cookie
  34. CORS_ORIGIN_ALLOW_ALL = True  # 放行所有
  35. CORS_ORIGIN_WHITELIST = ('*')  # 白名单
  36. # CORS_ALLOW_METHODS:字符串列表,允许用哪些HTTP请求方法。
  37. CORS_ALLOW_METHODS = (
  38.     'DELETE',
  39.     'GET',
  40.     'OPTIONS',
  41.     'PATCH',
  42.     'POST',
  43.     'PUT',
  44.     'VIEW',
  45. )
  46. # CORS_ALLOW_HEADERS:字符串列表,允许使用哪些非标准HTTP请求头。
  47. CORS_ALLOW_HEADERS = (
  48.     'accept',
  49.     'accept-encoding',
  50.     'authorization',
  51.     'content-type',
  52.     'dnt',
  53.     'origin',
  54.     'user-agent',
  55.     'x-csrftoken',
  56.     'x-requested-with',
  57. )
复制代码
二、
  1. # 可以自己注册一个中间件,在中间件process_response方法中对response进行封装
  2. def process_response(self, request, response):
  3.     response["Content-Type"] = "application/json"  # 响应信息的内容格式
  4.     response["Access-Control-Allow-Origin"] = "*"  # 允许跨域请求的源地址, * 表示:允许所有地址
  5.     response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"  # 允许跨域请求的具体方法
  6.     response["Access-Control-Max-Age"] = "1000"  # 用来指定本次预检请求的有效期,单位为秒,,在此期间不用发出另一条预检请求。
  7.     response["Access-Control-Allow-Headers"] = "*"
  8.     return response
复制代码

  • 跨域实现流程为
    1、浏览器会第一次先发送options请求询问后端是否允许跨域,后端查询白名单中是否有这两个域名
    2、如过域名在白名单中则在响应结果中告知浏览器允许跨域
    3、浏览器第二次发送post请求,携带用户登录数据到后端,完成登录验证操作

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

络腮胡菲菲

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表