2021-10-20

SpringBoot解决CORS跨域问题

最近在跟前端联调时出现的一个问题,在实训的过程中也出现过,大部分都是在使用excel文件下载时出现的。

项目后端架构基于springboot,前端主要是使用vue。

出现跨域的原因

跨域问题是浏览器对于ajax请求的一种安全限制:

一个页面发起的ajax请求,只能是于当前页同域名的路径,这能有效的阻止跨站攻击。

若没有该限制,那么任意一个网站中的js脚本都可以对其他任意网站进行恶意的攻击,因为cookie是浏览器端保存的重要数据,这样子就可以通过cookie在来跨域访问同一浏览器打开的网站,存在严重安全隐患;

HTTP的请求主要可以分为两种请求:简单请求和预检请求

简单请求:该请求类型不会触发CORS,满足以下条件均可以看作简单请求

请求方法:GET、POST、HEAD

请求头:Origin、Accept、Accept-Language、Content-Language、Content-Type 、Last-Event-ID

(其中Content-Type的值有以下几种:text/plain、multipart/form-data、application/x-www-form-urlencoded)

其中的Origin中会指出当前请求属于哪个域(协议+域名+端口)。

服务会根据这个值决定是否允许其跨域。

预检请求:请求时需要使用OPTIONS方法发起一个请求给服务器,即增加一次HTTP查询请求,以用于获取是否允许请求。

请求方法:PUT、DELETE、CONNECT、OPTIONS、TRACE、PATCH

请求头未使用上述简单请求中的几种方式,或者在使用Content-Type时并未使用该值中的几种方式。

出现的相关问题:

No ‘Access-Control-Allow-Origin’ header is present on the requested resource.
大部分都是在进行项目中使用excel下载时出现的错误。

解决方式

主要是后端通过使用response来设置响应头来解决。

//解决CORS跨域
response.setHeader("Access-Control-Allow-Origin", request.getHeader("origin"));
response.setHeader("Access-Control-Allow-Credentials", "true");

request.getHeader(“origin”)部分最好不要设置为星号,否则联调时前端可能会报
The value of the ‘Access-Control-Allow-Origin’ header in the response must not be the wildcard ‘*’ when the request’s credentials mode is ‘include’.

上一篇:Linux 删除文件夹和文件的命令


下一篇:Exception in thread "main" java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.ama