k8s下的spirngboot跨域问题

很烦的跨域问题

在前后端分离的情况下,假如在springboot没配置cors的情况下,就会出现这样的问题。

1
2
3
4
Access to XMLHttpRequest at 'http://localhost:8080/api' 
from origin 'http://localhost:63342' has been blocked by CORS policy:
Response to preflight request doesn't pass access control check:
No 'Access-Control-Allow-Origin' header is present on the requested resource.

那很简单,只要重写一下WebMvcConfigurer下的addCorsMappings方法就可以了,真就这么容易就好了,草

1
2
3
4
5
6
7
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.allowCredentials(true);
}

思考

根据以往的经验,一般请求链如下,通过浏览器然后通过nginx反向代理到springboot应用,按照从前来一直都没问题

1
web browser --> nginx --> springboot

但是我自己写了一个ajax在本地测试,发现是没有问题的,但是推送到测试服务器供前端测试的时候却不行

1
2
3
4
5
6
$.ajax({
method: "POST",
url: "http://localhost:8080/api",
}).then(function (value) {
console.log(value);
})

allowedHeader配置

然后前端那边提醒说到有自定义的请求头,然后我再测试,发现我本地也不行了

1
2
3
4
5
6
7
8
9
$.ajax({
method: "POST",
url: "http://localhost:8080/api",
headers:{
"token":"abc"
}
}).then(function (value) {
console.log(value);
})

然后再修改springboot里的配置,在通过上面的ajax测试,发现成了,然后高兴推送到测试服务器,结果我再测试发现依然不行

1
2
3
4
5
6
7
8
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.allowedHeaders("token")
.allowCredentials(true);
}

nginx

然后因为往常nginx也没有配置,发现也没有问题,然后这次居然不行,然后把目光投向k8s的nginx-ingress

接着google了一番,发现Ingress需要配置几个Annotation
最后

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo
namespace: demo
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-allow-headers: "token"
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
spec:
rules:
- host: api.demo.com
http:
paths:
- path: /
backend:
serviceName: demo-service
servicePort: 80

最后通过上述操作,终于可以了