来源:博客园
一、什么是跨域访问
说到跨域访问,必须先阐明一个名词:同源策略。所谓同源策略便是在浏览器端出于安全考量,向做事端发起要求必须知足:协议相同、Host(ip)相同、端口相同的条件,否则访问将被禁止,该访问也就被称为跨域访问。虽然跨域访问被禁止之后,可以在一定程度长进步了运用的安全性,但也为开拓带来了一定的麻烦。比如:我们开拓一个前后端分离的易用,页面及js支配在一个主机的nginx做事中,后端接口支配在一个tomcat运用容器中,当前端向后端发起要求的时候一定是不符合同源策略的,也就无法访问。那么我们如何办理这个问题?便是本文须要向大家解释的内容。
二、跨域访问的办理方案有哪些?
2.1.第一类方案:前端办理方案
虽然浏览器对付不符合同源策略的访问是禁止的,但是仍旧存在例外的情形,如以下资源引用的标签不受同源策略的限定:
html的script标签html的link标签html的img标签html的iframe标签:对付利用jsp、freemarker开拓的项目,这是实现跨域访问最常见的方法,除了基于HTML本身的特性实现跨域访问,我们还可以利用jsonp、window的postMessage实现跨域访问。这些都是前端实现跨域访问的办法。
2.2.第二类方案:利用代理
实际上对跨域访问的支持在做事端实现起来更加随意马虎,最常用的方法便是通过代理的办法,如:
nginx或haproxy代理跨域nodejs中间件代理跨域实在实现代理跨域的逻辑非常大略:便是在不同的资源做事:js资源、html资源、css资源、接口数据资源做事的前端搭建一个中间层,所有的浏览器及客户端访问都通过代理转发。以是在浏览器、客户端看来,它们访问的都是同一个ip、同一个端口的资源,从而符合同源策略实现跨域访问。
2.3 第三类方案:CORS
跨域资源共享(CORS):通过修正Http协议header的办法,实现跨域。说的大略点便是,通过设置HTTP的相应头信息,奉告浏览器哪些情形在不符合同源策略的条件下也可以跨域访问,浏览器通过解析Http协议中的Header实行详细判断。详细的Header如下:
CROS跨域常用header
Access-Control-Allow-Origin: 许可哪些ip或域名可以跨域访问Access-Control-Max-Age: 表示在多少秒之内不须要重复校验该要求的跨域访问权限Access-Control-Allow-Methods: 表示许可跨域要求的HTTP方法,如:GET,POST,PUT,DELETEAccess-Control-Allow-Headers: 表示访问要求中许可携带哪些Header信息,如:Accept、Accept-Language、Content-Language、Content-Type三、SpringBoot下实现CORS的四种办法
为大家先容四种实现CORS的方法,两种是全局配置,两种是局部接口生效的配置。一样平常来说,SpringBoot项目采取个中一种办法实现CORS即可。
3.1.利用CorsFilter进行全局跨域配置
3.2. 重写WebMvcConfigurer的addCorsMappings方法(全局跨域配置)
3.3.利用CrossOrigin表明(局部跨域配置)
将CrossOrigin表明加在Controller层的方法上,该方法定义的RequestMapping端点将支持跨域访问将CrossOrigin表明加在Controller层的类定义处,全体类所有的方法对应的RequestMapping端点都将支持跨域访问3.4 利用HttpServletResponse设置相应头(局部跨域配置)
这种办法略显麻烦,不建议在SpringBoot项目中利用。
四、实现与测试
在SpringBoot项目外随便定义一个HTML,并写代码触发如下的ajax代码。(触发过程我就不写了,定义一个按钮加一个监听函数即可)。以下是跨域AJAX要求验证的核心代码:
跨域要求配置成功表示:我们的跨域配置生效,ajax要求可以精确访问做事端接口。跨域要求配置失落败表示:我们的跨域配置未生效,请参照检讨第三节检讨各项配置是否精确。
末了,我自己是一名从事了多年开拓的JAVA老程序员,辞职目前在做自己的java私人定制课程,今年年初我花了一个月整理了一份最适宜2019年学习的java学习干货,可以送给每一位喜好java的小伙伴,想要获取的可以关注我的头条号并在后台私信我:【互换】,即可免费获取。