解决前后端联调的跨域问题(三种方法,最详细)

前提:在浏览器通过前端地址去访问后端的地址会出现跨域问题

1.各个浏览器的报错如下(如果符合,就说明你遇到的问题就是跨域问题)

chrome浏览器:

Access to XMLHttpRequest at 'http://localhost:63110/system/dictionary/all' from origin 'http://localhost:8601' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

firefox浏览器:

Bash
已拦截跨源请求:同源策略禁止读取位于 http://localhost:63110/system/dictionary/all 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。状态码:200。

2.原因:

被CORS policy阻止,因为没有Access-Control-Allow-Origin 头信息。CORS全称是 cross origin resource share 表示跨域资源共享。基于浏览器的同源策略,去判断是否跨域请求,同源策略是浏览器的一种安全机制,从一个地址请求另一个地址,如果协议、主机、端口三者全部一致则不属于跨域,否则有一个不一致就是跨域请求。

3.解决方法

第一种方法:JSONP(前后端改变)

通过script标签的src属性进行跨域请求,如果服务端要响应内容则首先读取请求参数callback的值,callback是一个回调函数的名称,服务端读取callback的值后将响应内容通过调用callback函数的方式告诉请求方,然后请求方再返回相应的结果。如下图:

第二种方法:添加响应头(后端添加配置)

服务端在响应头添加 Access-Control-Allow-Origin:*

详细代码如下(例子):

编写xxxxConfig.java文件

package com.xuecheng.system.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
* @Author: js
* @Description: 跨域过虑器
* @DateTime: 2024/4/15 9:42
* @Params:
* @Return
*/

@Configuration
public class GlobalCorsConfig {

    /**
     * 允许跨域调用的过滤器
     */
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        //允许白名单 域名进行跨域调用
        config.addAllowedOrigin("*");
        //允许跨越发送cookie
        config.setAllowCredentials(true);
        //放行全部原始头信息
        config.addAllowedHeader("*");
        //允许所有请求方法跨域调用
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

第三种方法:通过nginx代理跨域

由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址。

解释如下图:

浏览器到http://192.168.101.11:8601/api 没有跨域

nginx到http://www.baidu.com:8601通过服务端通信,没有跨域。

### 使用 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、付费专栏及课程。

余额充值