Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >九、Spring Boot 优雅的实现CORS跨域

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

作者头像
程序员爱酸奶
发布于 2020-02-29 09:27:43
发布于 2020-02-29 09:27:43
58200
代码可运行
举报
文章被收录于专栏:程序员爱酸奶程序员爱酸奶
运行总次数:0
代码可运行

前言

我们的springboot 架手架已经包含了mysql,redis,定时任务,邮件服务,短信服务,文件上传下载,以及docker-compose 构建镜像等等。

接下来让我们解决另一个常见的问题。一般的情况下,都是前后端分离的,我这个架手架的初衷也是前后端进行分离,所以这里就涉及到一个很严重的问题啦,当协议,端口,IP三者有其一不同就会产生跨域,所以需要做跨域支持。

测试跨域的文件

在这之前,我们先写一个测试接口是否跨域的html ,这样下面的测试比较方便。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<link type="test/css" href="css/style.css" rel="stylesheet">

<body>

    <input type="text" style="width:600px;height:30px;font-size:14px;" id="urlText" value="" />
    <br>
    <input type="button" style="margin: 10px";  id="cors" value="判断是否可访问"/>

<p>http://localhost:9090/zlflovemm/</p>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>  
<script type="text/javascript">
    $(function(){
    $("#cors").click(
        function(){
            var url2 = $("#urlText").val();
            $.post({
                contentType:'application/x-www-form-urlencoded;charset=UTF-8',
                url:url2,
                data: "/rAIeKeSBG1LV+XoIq82/O",
                success:function(data){
                    alert("success");
                }
            })
        });
    });
</script>
</body>
</html>

接下来我们来学习下在springboot 项目中怎么实现支持跨域。

@CrossOrigin 注解

这种方法是springboot 自带的,使用比较简单,在需要支持的跨域的接口上加上这个注解就可以了。比如在我们项目的demo 接口加上注解.就表示这个接口支持跨域,其中origins = "*" 表示所有的地址都可以访问这个接口,也可以写具体的地址,表示只有这个地址访问才能访问到接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@CrossOrigin(origins = "*")

测试

我们也来测试一下,启动项目后,在浏览器上运行我们的测试的html文件。发现localhost:9090/zlflovemm/ 是可以访问的。

说明跨域是支持的。大伙可以先将注解去掉测试一下,然后加上注解测试一下进行对比。

这种方式虽然很简单,但是缺点也不小,需要跨域的接口都需要加上这个注解,这对前后端分离的项目是不友好的,所以这种方式基本上用的很少。

重写WebMvcConfigurer的addCorsMappings 方法。

这种方法在实际项目中也用的比较多,是一种全局支持跨域的方法。我们创建一个CorsConfig 类。内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public 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 类,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Slf4j
@Component
public 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。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员爱酸奶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例,原理分析【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/25
17.4K0
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例,原理分析【享学Spring MVC】
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
点击关注公众号,Java干货及时送达 一、为什么会出现跨域问题 出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port) 二、什么是
Java技术栈
2022/07/26
7.1K0
Spring Boot 实现跨域的 5 种方式,总有一种适合你,建议收藏!!
SpringBoot 中实现跨域的5种方式
出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。2021Java面试宝典
程序员白楠楠
2021/02/19
4.3K0
SpringBoot跨域配置「建议收藏」
简单而言,跨域请求就是当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 HTTP 请求。举个简单的例子,从http://www.baidu.com,发送一个 Ajax 请求,请求地址是 http://www.taobao.com下面的一个接口,这就是发起了一个跨域请求,在不做任何处理的情况下,显然当前跨域请求是无法被成功请求,因为浏览器基于同源策略会对跨域请求做一定的限制。
全栈程序员站长
2022/09/13
9260
SpringBoot跨域配置
跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
小沐沐吖
2022/09/22
1.4K0
SpringBoot跨域配置
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
后端码匠
2021/01/06
3750
盘点 Spring Boot 解决跨域请求的几种方式
之所以会出现这个错误,是因为浏览器出于安全的考虑,采用同源策略的控制,防止当前站点恶意攻击 web 服务器盗取数据。
潘志的技术笔记
2024/07/02
3150
盘点 Spring Boot 解决跨域请求的几种方式
Springmvc与Springboot对跨域请求的处理办法
什么是跨域呢?跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。所谓同源是指,域名,协议,端口均相同,不明白没关系,举个例子:
游离于山间之上的Java爱好者
2022/08/09
2710
Springmvc与Springboot对跨域请求的处理办法
Spring Boot 解决跨域问题的 3 种方案!
前后端分离大势所趋,跨域问题更是老生常谈,随便用标题去google或百度一下,能搜出一大片解决方案,那么为啥又要写一遍呢,不急往下看。
Java技术江湖
2021/01/06
7080
5年经验程序员被问:前后端分离后,如何解决跨域问题?
做Web开发,经常会遇到跨域问题,小伙伴们在面试中,也经常被问到。这不,又有一位工作3年的小伙伴被问到这样一道题,说前后端分离后,如何解决跨域问题?
Tom弹架构
2023/09/07
2.3K0
5年经验程序员被问:前后端分离后,如何解决跨域问题?
Spring Boot:处理跨域问题
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
HLee
2021/07/03
2.1K0
Spring Boot:处理跨域问题
前后端分离后,Java Web开发如何解决跨域问题
做Web开发,经常会遇到跨域问题,小伙伴们在面试中,也经常被问到。这不,又有一位工作3年的小伙伴被问到这样一道题,说前后端分离后,如果解决跨域问题。
Tom弹架构
2022/12/19
8120
前后端分离后,Java Web开发如何解决跨域问题
Java如何解决跨域问题
跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。
Vincent-yuan
2021/10/13
2K0
springboot的跨域配置
场景: 在前后端分离协同开发的场景下,跨域是一个非常常见的问题,觉得有必要对这个问题来做一下记录,同时也是强化对这部分知识的学习
在水一方
2022/06/14
8340
springboot的跨域配置
Spring Boot 2.x(九):遇到跨域不用慌
只要协议,子域名,主域名,端口号这四项组成部分中有一项不同,就可以认为是不同的域,不同的域之间互相访问资源,就被称之为跨域。
山禾说
2019/01/21
8680
深入探讨跨域请求(CORS):原理、解决方案与详细示例代码
大家好!我是默语,一个喜欢探讨技术细节的博主。在这篇博客中,我们将深入探讨跨域请求(CORS),了解其原理,并提供具体的解决方案和详细的示例代码。跨域问题是前后端分离架构中经常遇到的一个难题,通过本篇文章,你将学会如何优雅地解决它!🤓
默 语
2024/11/22
4880
CORS跨域问题及解决方案详解
CORS(Cross-Origin Resource Sharing,跨域资源共享)跨域问题源于浏览器的同源策略。同源策略是浏览器的一种安全机制,它要求浏览器在访问一个资源时,该资源的协议、域名和端口必须与当前页面的协议、域名和端口完全一致,否则就会被视为跨域请求,浏览器会对这类请求进行限制。
威哥爱编程
2025/02/25
7500
SpringBoot如何解决跨域问题?
跨域问题是Web开发中常见的问题之一,特别是在前后端分离的项目中。Spring Boot作为一个流行的Java后端框架,提供了多种方式来解决跨域问题。本文将深入探讨Spring Boot如何解决跨域问题,包括原理分析、代码实现和示例展示。
程序猿川子
2024/11/25
5000
SpringBoot如何解决跨域问题?
SpringBoot跨域及三种解决方式
我们先了解下【域】的定义:协议 + 域名 + 端口。三者完全相同则为同域,反之有其一不同均为不同域。那么,什么是跨域请求?当前【发起请求】的域和【请求指向】的域属于不同域时,该次请求称之为跨域请求。简单说A应用只能访问A应用后台传来数据,B应用只能访问B应用后台传来的数据,如果A应用用Ajax获取数据时的URL地址中的协议、端口、域名其中有一个和B应用对应的话,则是A应用跨域了想获取B应用数据,是不允许的。在谈跨域之前,我们先来看看浏览器的同源策略。
崩天的勾玉
2021/12/24
24.5K1
SpringBoot跨域及三种解决方式
JAVA | Java 解决跨域问题 花式解决跨域问题
我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.
双鬼带单
2020/07/27
12.5K0
JAVA | Java 解决跨域问题 花式解决跨域问题
相关推荐
CORS跨域资源共享(三):@CrossOrigin/CorsFilter处理跨域请求示例,原理分析【享学Spring MVC】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验