首页 > 其他分享 >前后台分离跨域交互

前后台分离跨域交互

时间:2023-06-28 20:57:04浏览次数:42  
标签:跨域 分离 Access ALLOW CORS 交互 response 请求

目录

一、跨域问题详解

以后只要前后端分离项目,都会出现跨域问题,咱们要解决。

1.1 同源策略

同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

请求的url地址,必须与浏览器上的url地址处于同域上:也就是[域名],[端口],[协议]相同。

http://127.0.0.1:8080
ftf://127.0.0.1:8080

比如:我在本地上的域名是127.0.0.1:8000,请求另外一个域名:127.0.0.1:8001一段数据,浏览器上就会报错,这个就是同源策略的保护,如果浏览器对javascript没有同源策略的保护,那么一些重要的机密网站将会很危险。

已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8001/SendAjax/ 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')

请求发送,服务的执行,数据也正常返回,只是被浏览器拦截了。

正因为同源策略的存在,咱们写前后端分离的项目,无法正常获取到数据。

1.2 解决跨域问题:

1. jsonp 跨域(不了解)
2. 跨域资源共享(CORS)  后端技术
3. Nginx代理

二、CORS:跨域资源共享

CORS需要浏览器和服务器同时支持,所有浏览器都支持该功能。

只需要服务的处理即可:只需要在在响应头中加入固定的头就实现cors ---> 比如在响应头中加入Access-Control-Allow-Origin='*' ---> get请求就没有跨域了 ---> 但是put请求还会有。

  • cors的请求分两种
    • 简单请求,浏览器直接发起
    • 非简单请求,浏览器先发送要给options预检请求,服务端允许,再发送真正的请求

2.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.2 支持跨域

支持跨域,简单请求

服务器设置响应头:Access-Control-Allow-Origin = ‘域名’ 或 ‘*’

支持跨域,复杂请求

由于复杂请求时,首先会发送“预检”请求,如果“预检”成功,则发送真实数据。

  • “预检”请求时,允许请求方式则需服务器设置响应头:Access-Control-Request-Method
  • “预检”请求时,允许请求头则需服务器设置响应头:Access-Control-Request-Headers

2.3 解决跨域

# 使用cors解决跨域,就是再响应头中加入固定的一些东西,专门写个中间件
	    res['Access-Control-Allow-Headers'] = 'token'
        res['Access-Control-Allow-Methods'] = 'DELETE'
    	res['Access-Control-Allow-Origin'] = 'http://192.168.1.252:8080'

三、自定义中间件,解决跨域问题

common_mideleware.py

from django.utils.deprecation import MiddlewareMixin

自定义中间件

### 自定义中间件解决跨域问题 ---> 以后其它框架都是这个原理 ---> django上有人做了
class CorsMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if request.method == 'OPTIONS':
            response['Access-Control-Allow-Headers'] = 'token'
            response['Access-Control-Allow-Methods'] = 'DELETE'
        response['Access-Control-Allow-Origin'] = '*'
        return response

配置文件

### 配置文件配置中间件
    MIDDLEWARE = [
        'utils.common_mideleware.CorsMiddleware'
    ]

四、django使用django-cors-headers解决跨域问题

4.1 使用pip安装

pip install django-cors-headers

4.2 添加到setting的app中

INSTALLED_APPS = (
	...
	'corsheaders',
	...
)

4.3 添加中间件

MIDDLEWARE = [  
	...
	'corsheaders.middleware.CorsMiddleware',
	...
]

4.4 setting下面添加下面的配置

CORS_ORIGIN_ALLOW_ALL = True
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'  # 后期根据自己的请求头再加
)

五、django-cors-headers源码

# 核心代码再中间件的 ---> process_response  3.0.14 版本
class CorsMiddleware(MiddlewareMixin):
    def process_response(self, request, response):
        if (
            not conf.CORS_ALLOW_ALL_ORIGINS
            and not self.origin_found_in_white_lists(origin, url)
            and not self.check_signal(request)
        ):
            return response
        if conf.CORS_ALLOW_ALL_ORIGINS and not conf.CORS_ALLOW_CREDENTIALS:
            response[ACCESS_CONTROL_ALLOW_ORIGIN] = "*"
        else:
            response[ACCESS_CONTROL_ALLOW_ORIGIN] = origin
        if request.method == "OPTIONS":
            response[ACCESS_CONTROL_ALLOW_HEADERS] = ", ".join(conf.CORS_ALLOW_HEADERS)
            response[ACCESS_CONTROL_ALLOW_METHODS] = ", ".join(conf.CORS_ALLOW_METHODS) 
        return response

标签:跨域,分离,Access,ALLOW,CORS,交互,response,请求
From: https://www.cnblogs.com/zjyao/p/17512543.html

相关文章

  • .NET Core 允许跨域的两种方式实现(IIS 配置、C# 代码实现)
    〇、前言当把开发好的WebApi接口,部署到Windows服务器IIS后,postman可以直接访问到接口并正确返回,这并不意味着任务完成,毕竟接口嘛是要有交互的,最常见的问题莫过于跨域了。若前端文件是在当前接口文件下的wwwroot文件夹下,那么接口的访问就没问题,因为是同协议(http、https)......
  • 读写分离
    拓扑图:推荐步骤:配置安装Mysql配置一主两从安装三台Mysql服务器配置和验证Mysql数据库主从复制配置和验证Mysql数据库的读写分离实验步骤:配置安装Mysql配置一主两从安装三台Mysql服务器0203如上配置和验证Mysql数据库主从复制......
  • 如何解决跨域问题
    方法一在类上增加@CrossOrigin注解方法二在Gateway网关的application.yml配置文件中增加以下配置spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins:"*"allowedMethods:"*"......
  • 高德地图动态Marker和自定义弹框、交互事件、中心点跳转
    高德地图vue3使用下载NPM:npmi@amap/amap-jsapi-loader--save根据官网提示,VUE3需要改变监听模式下载npmi@vue/reactivity组件内配置初始化<scriptsetup>//开发技术vue3piniatsimport{ref}from"vue";importAMapLoaderfrom"@amap/amap-jsapi-loa......
  • spring mvc 和ajax异步交互完整实例
    spring MVC异步交互demo:1.jsp页面: 1.<%@pagelanguage="java"contentType="text/html;charset=utf-8"2."utf-8"%>3.<!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/......
  • 前端解决跨域
    重新整理了下Vue的接口去跨域的事,其实就两个地方实际生效,其他地方乱写端口什么的反倒是阻碍了。这边展示Vue3+Vite的例子://写在vite.config里server:{port:81,//定义前端程序使用的端口disableHostCheck:true,proxy:{'api':{tar......
  • Nginx配置origin限制跨域请求 转载
    按照等保要求,跨域的不安全性,需要修复。这个需要根据客户端传递的请求头中的Origin值,进行安全的跨站策略配置,目的是对非法的origin直接返回403错误页面。漏洞复现复现方式为在Header中指定Origin请求头,看是否可以请求成功。能够请求成功,说明未对请求头进行控制,有漏洞。cu......
  • 基于前端Vue后端.NetCore Web后台管理系统通用开本框架采用前后端分离技术
    基于前端Vue后端.NetCoreWeb后台管理系统通用开本框架采用前后端分离技术,前端使用vue2.6.0,后端使用.netcore3.1,支持跨平台、多租户、支持MySQLSQLServerOracle多数据库,模块化设计,高性能,高颜值,不管是个人学习还是企业做项目都非常适合 原创文章,转载请说明出处,资料来源:http://im......
  • springboot 跨域设置
      写文章 SpringBoot项目解决跨域的几种方案小满只想睡觉一直快乐!​关注她  在用SpringBoot开发后端服务时,我们一般是提供接口给前端使用,但前端通过浏览器调我们接口时,浏览器会有个同源策略的限制,即协议,域名,端口任一不一样时都会......
  • 前端文件上传的几种交互造轮子 | 京东云技术团队
    背景前端文件上传本来是一个常规交互操作,没什么特殊性可言,但是最近在做文件上传,需要实现截图粘贴上传,去找了下有没有什么好用的组件,网上提供的方法有,但是没找完整的组件来支持cv上传,经过了解发现可以用剪贴板功能让自己的cv实现文件上传,于是自己就整合了目前几种文件上传的交互方式......