EchisanBlog
k8s下的spirngboot跨域问题

很烦的跨域问题

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

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方法就可以了,真就这么容易就好了,草

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
            .allowedOrigins("*")
            .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
            .allowCredentials(true);
}

思考

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

web browser --> nginx --> springboot

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

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

allowedHeader配置

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

$.ajax({
            method: "POST",
            url: "http://localhost:8080/api",
            headers:{
                "token":"abc"
            }
        }).then(function (value) {
            console.log(value);
        })

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

@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
最后

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

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