spring vue 打包后的跨域请求资源(跨域preflight)问题

spring vue 打包后的跨域请求资源(跨域preflight)问题

问题描述

最近刚学习前后端的知识,就简单的做了一个前后端分离的项目.当在vue中使用axios或者fetch等去获取spring的API接口的时候会报跨域错误即 CORS 跨域资源共享错误

简单地说 我的vue 运行在http://localhost:8080端口上 而spring 运行在http://localhost:8085端口上由于这两个端口不同所以在请求的时候视为跨域,这个时候就无法简单的通过请求获得。

解决方案

1.nginx

使用nginx代理,nginx反向代理原理如下

image-20210312163447724

即我们客户端想要访问真正的后端的时候实际上是访问代理服务器,由代理服务器去转发到服务器去取回我们需要的数据。

由此,下载nginx在nginx.conf文件中输入自己要代理的数据。

    server {
        listen       8888;# 服务器监听的端口,前端访问这个端口
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }

    location /api/ {//监听的路径信息
	     	proxy_pass http://<后端的IP或者域名>:<端口>;//监听到上述的路径后将转发到这个代理上去
		    add_header Access-Control-Allow-Origin *;
            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,token';
    }	
}

让后启动nginx服务即可,此后把前端中应该访问地址 改为<后端的IP或地址>:<nginx监听的端口>我这里就是http://<ip或者域名>:8888。请求即可正常到达。

2.在后端中配置

因为后端使用spring,所以可以在controller层中添加一个annotation

@CrossOrigin(origins = "<这里填允许跨域访问的地址和端口信息>")
//比如@CrossOrigin(origins = "http://localhost:8080")

这个annotation可以在每个mapping中进行使用也可以对整个controller层进行使用。

preflight错误

在完成上述以后,get方法能够正常的使用而post方法不能正常使用,报了一个preflight错误,这个错误的原因是当我们的请求不是一个简单请求的使用,会先发一个询问信息,在发送post请求,如果我们直接发data过去服务器就会发生这个错误使用axios发送的默认是 application/json不是一个简单的请求,所以我们可以把他转为简单请求 Content-Type: application/x-www-form-urlencoded

如何解决

在vue项目中axios加上头信息 Content-Type: application/x-www-form-urlencoded然后使用qs.stringfy({这里是json格式的数据})把数据转化为如下信息,即可进行post,此时spring中image-20210312165213981

同时spring中相关的controller

    @PostMapping(consumes = "application/x-www-form-urlencoded")
    public  void postToDb( Study study) throws Exception {
        studyService.postToDb(study);
    }

如上即可正常的post了

Vue.js应用中处理跨域问题主要有几种方法: 1. **后端设置**: - 如果能控制服务器端,可以在服务器上配置允许特定来源的跨域请求。例如,在Node.js的Express应用中可以使用`express-cors`中间件,设置允许访问的`Access-Control-Allow-Origin`头。 ```javascript const cors = require('cors'); app.use(cors({ origin: 'http://your-domain.com', // 或者 '*' 允许所有域名 })); ``` 2. **JSONP**(JSON with Padding): 对于GET请求,如果目标服务器支持JSONP,可以在后端设置动态插入脚本的方式返回数据,然后在前端通过script标签获取。 3. **代理** (vue.config.js): Vue CLI 4.x及更高版本提供了`proxy`选项来自动处理跨域。在`vue.config.js`中添加代理规则: ```javascript module.exports = { devServer: { proxy: { '/api': { target: 'https://api.example.com', changeOrigin: true, pathRewrite: { '^/api': '' }, }, }, }, }; ``` 这里将所有的`/api`请求转发到`https://api.example.com`。 4. **CORS Preflight**(预检请求): 如果你发送的是PUT、PATCH或DELETE这类需要权限的操作,可能会触发CORS的预检请求(OPTIONS)。在响应中设置适当的`Access-Control-Allow-Methods`,并确保`Access-Control-Allow-Headers`包含了所有预期的请求头。 5. **使用axios等库的拦截器**: 可以在axios的拦截器中处理跨域错误,比如设置自定义的错误处理器。 ```javascript axios.interceptors.response.use( response => response, error => { if (error.response.status === 404) { // handle not found case } else if (error.response.status === 401) { // handle unauthorized case } return Promise.reject(error); } ); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值