axios配合服务器端设置跨域访问

标签: 无 分类: 未分类 创建时间:2019-07-15 07:45:37 更新时间:2024-11-15 10:49:44

1.IIS配置

axios为了实现跨域访问,这里使用IIS进行实例。要是实现跨域访问,打开IIS服务器中HTTP响应头一栏,看到里面只有一个选项:

浏览器请求时,会出现跨域错误:

这个时候,服务器HTTP响应头中添加:”Access-Control-Allow-Origin -> *”

设置完成之后,发现还是有错误:

这是因为axios默认的get请求会添加一个 “Access-Control-Request-Headers: content-type” 的请求头,

所以应该继续添加IIS服务器的响应头 “ Access-Control-Allow-Headers -> Origin, X-Requested-With, Content-Type, Accept “

这样便可以实现跨域访问了,如果其他后台服务,比如Spring Boot编写的语言,只需要将设置相应投即可,例:response.setHeader(“Access-Control-Allow-Headers”, “ Origin, X-Requested-With,Content-Type, Accept”);

有时候为了实现后台得到前台的用户身份,需要设置:axios.defaults.withCredentials = true; 将cookie信息携带,后台可以做用户验证。开启这个选项之后,后台可以拿到身份认证信息,但是前台会报错:

这个时候要修改:Access-Control-Allow-Origin -> *,将其设置为具体的带端口号的访问形式:比如前台的访问页面是localhot:8088,则设置:

这个时候,前台还是有错误,比如:

这个时候,IIS中的响应头,应该添加:”Access-Control-Allow-Credentials -> true”

最后大功告成:(这里错误是服务器错误,不是跨域的问题)

1
2
3
4
Access-Control-Allow-Credentials -> true
Access-Control-Allow-Headers -> Origin, X-Requested-With, Content-Type, Accept
Access-Control-Allow-Origin -> http://localhost:8088

2.nginx配置

使用nginx配置跨域的时候,即便是设置了 add_header Access-Control-Allow-Origin ,还是有可能在OPTION请求中出现403错误。

这个时候应该设置OPTION请求返回return 204状态码就好了。

nginx配置的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
## 设置跨域白名单
set $cors_origin "";
if ($http_origin ~* "^http://dev.proheng.net") {
set $cors_origin $http_origin;
}
if ($http_origin ~* "^http://localhost") {
set $cors_origin $http_origin;
}

## location的配置
location ^~/phpublic {
client_max_body_size 40m;

proxy_pass http://localhost:8080/$request_uri;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;

## 跨域

add_header Access-Control-Allow-Origin $cors_origin;
add_header Access-Control-Allow-Methods "POST, GET, OPTIONS";
add_header Access-Control-Allow-Headers "Origin, Authorization,X-Requested-With,Content-Type, Accept";
add_header Access-Control-Allow-Credentials true;

if ($request_method = 'OPTIONS') {
return 204;
}

}

其中如果不配置$request_method = ‘OPTIONS’这个,还是会出现:”Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource”

参考文章:
1.Nginx配置跨域请求 Access-Control-Allow-Origin * (这里讲了如何配置预检请求的通过和原理,其实应该仔细的查看)
2.如何解决出现AXIOS的Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response. (这里讲了如何通过代码的方式进行设置Content-Type)
3.Nginx 跨域 add_header 403状态下无效 (这个多半无效)

3.凭据不支持,如果 CORS 头 ‘Access-Control-Allow-Origin’ 为 ‘*’)

服务器已经设置了跨域,但是请求的时候,还是报错了,这个主要就是在设置的时候开启了cookie支持,关闭之后就可以了。

1
2
3
4
5
const server = axios.create({
baseURL: baseURL,
timeout: 50 * 1000,
withCredentials: true // 是否携带cookie ,主要是这个
})
参考文章:
1.HTTP访问控制(CORS)踩坑小记 将 XMLHttpRequest 的 withCredentials 标志设置为 true,从而向服务器发送 Cookies。服务器端的响应需要携带 Access-Control-Allow-Credentials: true ,浏览器才会把响应内容返回给请求的发送者。
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。