解决前后端分离-cookie跨域问题

本文详细介绍了如何在Nginx服务器上配置跨域请求,并在Vue前端项目中设置Axios请求参数,实现前后端分离部署下跨域问题的有效解决。

服务端nginx配置如下:

        location /express-app {
                add_header Access-Control-Allow-Origin $http_origin; //此处不能为*,否则下方的Credentials 不会生效

                add_header Access-Control-Allow-Credentials 'true';
                add_header Access-Control-Allow-Methods 'GET, POST ,OPTIONS';
                add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,Id';
                if ($request_method = 'OPTIONS') {
                        return 204;
                }
                proxy_pass http://127.0.0.1:6001;
                proxy_set_header   X-Forwarded-Proto $scheme;
                proxy_set_header   Host              $http_host;
                proxy_set_header   X-Real-IP         $remote_addr;
                proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
                proxy_set_header Cookie $http_cookie;
        }

前端VUE中配置如下:

// 默认请求地址
Axios.defaults.baseURL = baseURL
// 超时时间
Axios.defaults.timeout = 5000
// 允许携带cookie请求
Axios.defaults.withCredentials = true
// 请求格式及编码
Axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8'

<think>嗯,用户之前问了如何实现Spring Boot和Vue前后端分离,现在又具体问问题解决方案。我需要结合之前的回答和用户提供的引用内容来整理解决方案。 首先,用户提供的引用[1]到[4]提到了几种解决方法,比如CORS配置、Nginx代理、前端代理等。之前的回答里我提到过后端的CORS配置和前端部署的整合,现在需要更详细地展开这些方法,并补充其他可能的方案。 用户可能想知道不同环境(开发和生产)下的处理方式,以及各种方法的优缺点。比如开发时前端用Vue CLI代理,生产时用Nginx统一名。引用[2]提到通过同部署避免,这可能是一个重要的点,需要强调。 还要注意引用中提到的一些过时类,比如WebMvcConfigurerAdapter,现在应该推荐使用WebMvcConfigurer接口,避免继承WebMvcConfigurationSupport导致的问题,这点需要提醒用户。 另外,用户可能对具体配置步骤不太清楚,比如如何在Vue中配置代理,或者在Spring Boot中通过注解或过滤器处理。需要分步骤说明,并提供代码示例,确保用户能跟着操作。 最后,用户可能需要了解不同方案的适用场景,比如小型项目用注解,大型项目用全局配置,或者生产环境用Nginx反向代理。需要总结这些场景,帮助用户选择最合适的方法。 总之,整理出几种主要方案,分开发和生产环境,给出具体步骤和代码,同时指出注意事项和推荐场景,确保回答全面且实用。</think>### Spring Boot + Vue 前后端分离问题解决方案 --- #### 一、问题的本质 前后端分离项目中,**浏览器安全策略(同源策略)** 会阻止不同源(协议/名/端口任意一项不同)的请求交互。例如: - 前端运行在 `http://localhost:8080`(Vue开发服务器) - 后端运行在 `http://localhost:8081`(Spring Boot服务) --- #### 二、主流解决方案对比 | 方案类型 | 适用场景 | 优缺点 | |-------------------|---------------------------|---------------------------------------| | **后端CORS配置** | 开发/生产环境通用 | 标准化方案,但需后端代码修改 | | **Nginx反向代理** | 生产环境部署 | 零代码侵入,需运维配置 | | **前端代理** | 开发环境调试 | 仅限Vue CLI开发模式使用 | | **Spring Security** | 集成安全框架时 | 需处理权限过滤与优先级问题 | --- #### 三、具体实现方案 ##### 1. 后端CORS全局配置(推荐) **Spring Boot中通过`WebMvcConfigurer`配置**(注意避免使用已废弃的`WebMvcConfigurerAdapter`): ```java @Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("http://localhost:8080") // Vue开发地址 .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true) // 允许携带Cookie .maxAge(3600); } } ``` **关键点**: - `allowedOrigins`可配置为`"*"`但不推荐(存在安全风险) - `allowCredentials(true)`需与前端`axios`的`withCredentials: true`配合使用[^1] - 若使用Spring Security,需确保配置优先级高于权限过滤[^3] --- ##### 2. 生产环境Nginx反向代理 **通过统一名消除**(引用[2]方案): ```nginx server { listen 80; server_name www.javaboy.org; # 前端静态资源 location / { root /opt/frontend/dist; index index.html; try_files $uri $uri/ /index.html; } # 后端API代理 location /api/ { proxy_pass http://backend-server:8081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ``` **优势**: - 前端(`www.javaboy.org`)与API(`www.javaboy.org/api/`)同源 - 无需额外配置[^2] --- ##### 3. 开发环境前端代理(Vue CLI) **vue.config.js配置代理**(避免浏览器直接请求后端): ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'http://localhost:8081', // Spring Boot地址 changeOrigin: true, pathRewrite: { '^/api': '' } } } } } ``` **调用示例**: ```javascript axios.get('/api/users') // 实际转发到http://localhost:8081/users ``` --- ##### 4. 注解级局部控制 **在Controller类/方法添加`@CrossOrigin`**: ```java @RestController @CrossOrigin(origins = "http://localhost:8080") // 类级别 @RequestMapping("/api") public class UserController { @CrossOrigin // 方法级别(继承类级别配置) @GetMapping("/users") public List<User> getUsers() { return userService.findAll(); } } ``` --- ##### 5. 过滤器方案(兼容老旧系统) ```java @Bean public FilterRegistrationBean<CorsFilter> corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("http://localhost:8080"); config.addAllowedMethod("*"); config.addAllowedHeader("*"); source.registerCorsConfiguration("/**", config); return new FilterRegistrationBean<>(new CorsFilter(source)); } ``` --- #### 四、常见问题排查 1. **OPTIONS预检请求失败** - 确保后端允许`OPTIONS`方法 - Spring Security需配置`.antMatchers(HttpMethod.OPTIONS).permitAll()` 2. **携带Cookie失效** - 后端配置`.allowCredentials(true)` - 前端设置`axios.defaults.withCredentials = true` 3. **响应头缺失** 检查是否缺少`Access-Control-Allow-Origin`等关键头信息 --- #### 五、方案选型建议 | 场景 | 推荐方案 | |----------------------|--------------------------| | 本地开发调试 | Vue CLI代理 + 后端CORS | | 中小型生产项目 | Nginx反向代理 | | 需要精细控制API权限 | Spring Security + CORS | | 遗留系统改造 | 过滤器方案 | --- #### 六、扩展阅读 - [Spring官方CORS文档](https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-cors) - [MDN资源共享(CORS)](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS)[^4] --- **相关问题**: 1. 如何通过Spring Security配置白名单? 2. Nginx反向代理时如何处理WebSocket? 3. 场景下如何保障JWT令牌的安全传输?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值