python前后端跨域请求问题

一、 Access-Control-Allow-Origin

方法1:使用 response.setHeader(“Access-Control-Allow-Origin”,"*"); 可以解决

目前的浏览器为了数据的安全,所有请求被严格限制在同一域名下,如果需要从不同的服务器(不同域名)上获取数据,那么需要使用跨域HTTP请求。
实现跨域的方式是在请求的目标网站后台中(以java servlet为例)添加如下代码:

response.setHeader("Access-Control-Allow-Origin","*");  //允许所有域名访问
response.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Headers", "x-requested-with,Authorization");
response.setHeader("Access-Control-Allow-Credentials", "true");

方法2:添加端口转发技术

在vue项目目录中,在webpack.base.config.js文件下*,写入

module.exports ={
	devServer:{
			proxy: {
				'/api/':{
					target: 'http://127.0.0.1:8080/',
					pathRewrite: {'^/api/': '/'},
					changeOrigin: true
				},
			}
		}
	}
}

二、

d

j

a

n

g

o

C

S

R

F

p

r

o

t

e

c

t

F

o

r

b

i

d

d

e

n

403

\color{red}{django CSRF protect (防止出现Forbidden 403)}

djangoCSRFprotectForbidden403

方法1:view,py方法上加装饰器 @csrf_exempt

在这里插入图片描述

方法2: 在html页面上直接写入csrf,

在这里插入图片描述

方法3: 去掉django的中间件CsrfViewMiddleware,settings里配置

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
     # 'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

CSRF

CSRF是跨站点请求伪造,简单来说就是用户在访问受信任网站后,浏览器记录了受信任网站的cookie,此时用户在不登出受信任网站的同时访问了危险网站,危险网站的请求和cookie一起到达服务器,服务器Session未过期的时候,就误认为该请求是用户发出的,从而被危险网站利用。目前解决CSRF攻击的方法,常用的方法就是进一步确认一个请求是来自于用户还是危险网站,就是客户端发送请求时,增加伪随机数,常用的方法有3种:
(1)验证码
(2)客户端登陆后发送token给服务器,且客户端每一次请求都带上这个token,服务器记录第一次登陆后的token,并对每一次请求进行验证
(3)在HTTP头中自定义属性并验证

Django的CSRF保护机制

HTTP请求,分为两类:“安全请求”和“不安全请求”。GET是“安全请求”, POST, PUT, DELETE是“不安全请求”。安不安全,主要还是看请求设计者。比如,如果银行系统的转账设计是用GET进行的,那GET也是不安全的。所以一般GET就用于获取资源,不要进行资源更新操作,资源更新交给POST来做。

对于“不安全请求”,Django设计了CSRF验证,简单来说这个机制是这样的:
(1) 客户端访问Django站点,Django服务器向客户端发送名为”csrftoken”的cookie
(2) 客户端对Django服务器发送不安全请求时,必须在HTTP头部加入”X-CSRFToken”字段,并将这个cookie的值作为该字段的值
(3) Django服务器端会对HTTP头部X-CSRFToken的值进行验证,依次来判断这个请求是不是来自合法用户