SpringCloudGateway+Vue前后端联调解决跨域问题

前端项目会在index.js中配置api接口的基本请求路径

比如路径为 http://localhost:88/api

 window.SITE_CONFIG['baseUrl'] = 'http://localhost:88/api';

为什么会是这个请求呢,首先前端项目要向后端发数据,肯定要现发送给微服务中的网关gateway,而gateway中配置的端口为88

但前端项目的启动端口为8001

从8001端口向88端口发送请求,必然是跨域请求

所以我们要在服务端对请求进行过滤,服务端收到请求之后,通过 过滤器 在请求响应的时候,在响应头中添加进入允许跨域的信息。但是之前我们不是说浏览器会拦截跨域请求吗?为什么请求还能到达服务端呢?

因为浏览器有一个特殊的请求,也就是预检请求。

所有非简单请求,现在可以简单理解为除了GET、POST的请求,都会先向服务器发送一个预检请求,询问服务器是否允许跨域访问,我们要做的就是在预检请求的时候,向预检请求的响应头中加入允许访问的策略。

@Configuration
public class GulimallCorsConfiguration {

    @Bean
    public CorsWebFilter corsWebFilter(){
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration corsConfiguration = new CorsConfiguration();

        //1、配置跨域
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);

        source.registerCorsConfiguration("/**",corsConfiguration);
        return new CorsWebFilter(source);
    }
}

通过编写一个简单的配置文件,暂时让所有的请求方法,参数等都允许跨域,这样在返回的预检请求的请求头中就会出现下面这样

这里我们可以看到

请求的方式 是 options

请求的地址 http://localhost:88/api/sys/login

请求源(Access-Control-Allow-Origin)是 http://localhost: 8001

网关接收到请求后需要根据路由将请求转发给对应的微服务,这里需要配置路由断言

spring:
   cloud:
    gateway:
      routes:
        - id: admin_route
          uri: lb://renren-fast
          predicates:
            - Path=/api/**
          filters:
            - RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}

这里通过路由断言predicates, 如果接收到了以/api开头的请求 ,则使用路由过滤器filters,

将以/api开头的请求转换为以/renren-fast开头的路径,后面携带的参数不变,例如

原来的路由请求
http://localhost:88/api/captcha.jpg  

通过路由断言和过滤器之后 变成
http://localhost:88/renren-fast/captcha.jpg

这样就可以将所有非同源请求进行放行,完成跨域访问。

当然这只是在开发阶段为了方便前后端联调,在项目上线的时候使用的是nginx服务器进行反向代理,后面会更新使用nginx完成跨域请求的策略

### 使用 Nginx 配置解决前后端联调中的 CORS 问题 为了有效处理前端 Vue 和后端 Python 应用之间的请求,可以利用 Nginx 进行反向代理配置。这不仅解决资源共享 (CORS) 的限制,还提高了系统的灵活性和安全性。 #### 1. 安装并启动 Nginx 确保已安装 Nginx 并正常运行。可以通过命令 `sudo systemctl start nginx` 启动服务[^1]。 #### 2. 修改 Nginx 配置文件 编辑默认站点配置文件 `/etc/nginx/sites-available/default` 或创建新的虚拟主机配置: ```nginx server { listen 80; server_name your_domain_or_ip; location /api/ { proxy_pass http://backend_server_address/; add_header Access-Control-Allow-Origin *; # 允许所有来源访问, 生产环境建议指定具体名 add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; if ($request_method = 'OPTIONS') { return 204; } } location / { root /path/to/vue/dist; try_files $uri $uri/ /index.html; } } ``` 这段配置实现了两个主要功能: - 对于以 `/api/` 开始的路径,将其转发给实际的后端服务器地址; - 设置必要的 HTTP 响应头来允许来自特定源的请求[^2]。 #### 3. 测试配置有效性 保存更改后的配置文件,并执行以下命令测试语法正确性和重新加载 Nginx: ```bash sudo nginx -t sudo systemctl reload nginx ``` 此时,在前端应用中发送至 `/api/*` 的任何 AJAX 请求都将被 Nginx 正确路由到对应的后端 API 接口,而不会触发浏览器的安全策略阻止[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值