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’.