请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

九、Spring Boot 优雅的实现CORS跨域

[复制链接]
查看: 49|回复: 0

2万

主题

3万

帖子

8万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
80226
发表于 2019-12-5 12:30 | 显示全部楼层 |阅读模式
前言

我们的springboot 架手架已经包含了mysql,redis,按时使命,邮件办事,短佩办事,文件上传下载,以及docker-compose 构建镜像等等。
接下来让我们打点另一个常见的题目。一样平常的情况下,都是前后端分手的,我这个架手架的初衷也是前后端举行分手,所以这里就触及到一个很严重的题目啦,当协议,端口,IP三者有其一不同就会发生跨域,所以需要做跨域支持。
测试跨域的文件

在这之前,我们先写一个测试接口能否跨域的html ,这样下面的测试比力方便。
  1.         Title        
  2.     http://localhost:9090/zlflovemm/
  3.   
复制代码
接下来我们来进修下在springboot 项目中怎样实现支持跨域。
@CrossOrigin 注解

这类方式是springboot 自带的,操纵比力简单,在需要支持的跨域的接口上加上这个注解便可以了。
比如在我们项方针demo 接口加上注解.就表示这个接口支持跨域,其中origins = "*"
表示全数的地址都可以拜候这个接口,也可以写具体的地址,表示只要这个地址拜候才华拜候到接口。
@CrossOrigin(origins = "*")
九、Spring Boot 优雅的实现CORS跨域  游戏 1808952-20191205090517382-1575424182

测试

我们也来测试一下,启动项目后,在欣赏器上运转我们的测试的html文件。
发现localhost:9090/zlflovemm/ 是可以拜候的。
九、Spring Boot 优雅的实现CORS跨域  游戏 1808952-20191205090517777-955576031

说明跨域是支持的。大伙可以先将注解去掉测试一下,然后加上注解测试一下举行对照。
这类方式固然很简单,可是弱点也不小,需要跨域的接口都需要加上这个注解,这对前后端分手的项目是不友爱的,所以这类方式底子上用的很少。
重写WebMvcConfigurer的addCorsMappings 方式。

这类方式在现实项目中也用的比力多,是一种全局支持跨域的方式。
我们建立一个CorsConfig 类。内容以下:
  1. @Configurationpublic class CorsConfig implements WebMvcConfigurer {    @Override    public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/**")//项目中的全数接口都支持跨域                .allowedOrigins("*")//全数地址都可以拜候,也可以设备具体地址                .allowCredentials(true)                .allowedMethods("*")//"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"                .maxAge(3600);// 跨域答应时候    }}
复制代码
加上@Configuration 表示是设备类,在项目启动的时候会加载。实现WebMvcConfigurer 接口并重写addCorsMappings 方式。代码比力简单,也有诠释。
测试的话,大家可以自行测试,我测试都是经过的和上面一样测试便可以,这里就不占篇幅了。
Filter

除了上面方式外,也可以操纵过滤器。我们建立一个CorsFilter 类,内容以下:
  1. @Slf4j@Componentpublic class CorsFilter implements Filter {    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        HttpServletResponse response = (HttpServletResponse)servletResponse;        response.setHeader("Access-Control-Allow-Origin", "*");        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");        response.setHeader("Access-Control-Max-Age", "3600");        response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization");        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");        response.setHeader("Pragma", "no-cache");        filterChain.doFilter(servletRequest,response);    }}
复制代码
上面代码中设备response.setHeader("Access-Control-Allow-Origin", "*");表示全数的地址都可以拜候项目接口。
番外

接下来我们再先容一个常用的功用,前后端分手,在拜候接口的时候,有的 公司常常会增加一下专属的后缀名才华拜候。现实上没有什么太大的感化,能稍微增加一下系统的平安性。这里我就简单是实现一下。真个都很是简单。
一样的是实现WebMvcConfigurer 接口,重写configurePathMatch你方式和增加一个dispatcherServlet。
代码以下:
  1. @Override    public void configurePathMatch(PathMatchConfigurer configurer) {        configurer.setUseRegisteredSuffixPatternMatch(true);    }    @Bean    public ServletRegistrationBean servletRegistrationBean(DispatcherServlet dispatcherServlet) {        ServletRegistrationBean bean = new ServletRegistrationBean(dispatcherServlet);        bean.addUrlMappings("*.zlf");        return bean;    }
复制代码
这个功用实现,就只用这个多代码,configurePathMatch方式中设备的configurer.setUseRegisteredSuffixPatternMatch(true); 重如果将index 和index.* 都指向我们controller 中设备的@RequestMapping("/index")。
下面的servletRegistrationBean 方式重如果增加自界说阻挡器,只要后缀为“.zlf”的接谈锋放行。
这样两步就简单的实现了接口增加自界说的后缀名啦。
到此为止,springboot 支持跨域的方式就差不多了,固然还有其他的实现方式没有研讨。这些渴望对大家有帮助。
好了,就说这么多啦
代码上传到github:
https://github.com/QuellanAn/zlflovemm
后续加油
接待大家关注小我公众号 "步伐员爱酸奶"
分享各类进修材料,包含java,linux,大数据等。材料包含视频文档以及源码,同时分享本人及投递的优良技术博文。
假如大家喜好记得关注和分享哟
九、Spring Boot 优雅的实现CORS跨域  游戏 1808952-20191205090518284-1560239317


免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表