SpringCloud中Gateway提示OPTIONS请求跨域问题

时间:2024-03-17 07:29:26

因为是新搭建的框架,所有组件也是用的标准组件,但在跟前端对接的时候,前端反馈说请求跨域了

我第一反应是配置文件没生效,谁改了配置文件

    gateway:
      # 全局跨域配置
      globalcors:
        cors-configurations:
          '[/**]':
            #allowedOrigins:
            # - "http://localhost:3333" #允许所有的域
            allowedOriginPatterns:
              - '*' #跨域处理 允许所有的域
            allowCredentials: true # 是否允许携带cookie
            allowedMethods: # 支持的方法
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders:
              - "*" # 允许在请求中携带的头信息

发现配置文件没问题,最近也没有人改配置相关的,然后我写了一个页面测试一下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://apps.bdimg.com/libs/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
    <input type="button" value="点击确认" onclick="checkOn()">

    <script>
        function checkOn() {
            $.get('http://localhost:8000/api-user/user/get/1', function (data) {
                alert(data)
            });
        }
    </script>
</body>
</html>

请求正常,能正常访问
然后告诉前端我这边测试正常的,不存在跨域问题
前端说不行他那还是跨域,甩个403异常截图,仔细看了下发现是个OPTIONS请求
打开postman用OPTIONS请求试了下,还真的提示跨域,然后各种百度跨域问题,发现全部都不行

后面同事发现有一个配置加上去就好了

add-to-simple-url-handler-mapping: true
    gateway:
      # 全局跨域配置
      globalcors:
        add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
        cors-configurations:
          '[/**]':
            #allowedOrigins:
            # - "http://localhost:3333" #允许所有的域
            allowedOriginPatterns:
              - '*' #跨域处理 允许所有的域
            allowCredentials: true # 是否允许携带cookie
            allowedMethods: # 支持的方法
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders:
              - "*" # 允许在请求中携带的头信息

add-to-simple-url-handler-mapping: true 是一个配置选项,通常用于 Spring MVC框架中的配置文件(如 applicationContext.xml 或者 Spring Boot 中的 application.properties/application.yml 文件)。

这个选项的作用是将 URL 路径映射到简单的 URL 处理器(SimpleUrlHandlerMapping)。当设置为 true 时,Spring MVC 将使用 SimpleUrlHandlerMapping 将指定的 URL 路径映射到对应的处理器(Handler)。这样做可以简化 URL 到处理器的映射配置,特别是对于一些简单的场景,例如静态页面的访问或者简单的请求处理。

举例来说,如果你希望将 “/hello” 路径映射到名为 “helloController” 的控制器上,你可以通过设置 add-to-simple-url-handler-mapping: true 来告诉 Spring MVC 将这个映射添加到 SimpleUrlHandlerMapping 中,而不需要显式地配置一个 HandlerMapping Bean 。

可以发现这个配置似乎与跨域没有关系,但是加上这个后真的就可以了