文章目录

  • 一、前言:
  • 二、什么是跨域问题?
  • 三、 为什么会出现跨域问题?
  • 四、什么情况下会出现跨域?
  • 五、如何解决跨域问题?
    • 5.1 使用@CrossOrigin注解
    • 5.2 使用WebMvcConfigurer
    • 5.3 使用Filter
  • 六、代码示例
    • 前端代码:
    • 后端后端:
  • 总结

一、前言:

随着 Web 技术的不断发展,前后端分离的开发模式逐渐成为主流。在这种模式下,前端和后端分别独立开发,前端与后端通信的方式多为使用 Ajax 发送 HTTP 请求。然而,由于浏览器的安全策略限制,可能会出现跨域问题,导致请求失败。本文将从以下几个方面进行总结:

  • 什么是跨域问题?
  • 为什么会出现跨域问题?
  • 什么情况下会出现跨域?
  • 如何解决跨域问题?
  • 代码示例

二、什么是跨域问题?

跨域问题指的是在 Web 应用程序中,由于同源策略的限制,导致浏览器无法发送跨域请求,也无法获取跨域响应的问题。同源策略是浏览器的一种安全策略,它要求 Web 应用程序只能访问与当前页面具有相同协议、主机名和端口号的资源。

如果不同源的 Web 应用程序需要通信,就需要进行跨域请求。但由于同源策略的限制,浏览器不允许跨域请求。在此情况下,如果前端需要访问其他域名下的资源,就会出现跨域问题。

三、 为什么会出现跨域问题?

出现跨域问题的主要原因是同源策略的限制。同源策略是浏览器的一种安全策略,它要求 Web 应用程序只能访问与当前页面具有相同协议、主机名和端口号的资源。

如果 Web 应用程序需要访问不同源的资源,就需要进行跨域请求。但由于同源策略的限制,浏览器不允许跨域请求。这是因为跨域请求可能会导致一些安全问题,例如 CSRF(跨站请求伪造)攻击。

四、什么情况下会出现跨域?

在 Web 应用程序中,以下情况可能会导致跨域问题:

域名不同:例如,当前页面的域名为 www.example.com,而请求的资源的域名为 api.example.com。
协议不同:例如,当前页面的协议为 https,而请求的资源的协议为 http。
端口号不同:例如,当前页面的端口号为 8080,而请求的资源的端口号为 9090。

五、如何解决跨域问题?

本文将详细介绍在SpringBoot中如何解决跨域问题:

5.1 使用@CrossOrigin注解

在SpringBoot的Controller层中可以通过@CrossOrigin注解来实现跨域访问控制,只需要在方法上添加该注解即可。

@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")@CrossOrigin(origins = "http://localhost:8080")public User getUser(@PathVariable Long id) {return userService.getUser(id);}
}

@CrossOrigin注解中的origins属性表示允许跨域请求的源地址,多个地址可以用逗号分隔。如果不指定该属性,则表示允许所有来源的请求。

需要注意的是,@CrossOrigin注解只适用于控制器方法,而不适用于控制器类。如果需要在整个控制器类中启用跨域访问控制,则可以在控制器类上添加@CrossOrigin注解,并设置对应的属性值。

5.2 使用WebMvcConfigurer

除了@CrossOrigin注解外,还可以通过实现WebMvcConfigurer接口来配置跨域访问控制。

@Configuration
public class CorsConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/user/**").allowedOrigins("http://localhost:8080").allowedMethods("GET", "POST", "PUT", "DELETE").allowCredentials(true).maxAge(3600);}
}

上述代码中,我们创建了一个名为CorsConfig的配置类,并实现了WebMvcConfigurer接口。在addCorsMappings()方法中,我们定义了允许跨域访问的映射路径、允许访问的来源、允许访问的HTTP方法、是否允许发送Cookie和响应的缓存时间等信息。

5.3 使用Filter

还可以通过自定义Filter来实现跨域访问控制,这种方式比较灵活,但相对比较繁琐。

@Component
public class CorsFilter implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) res;HttpServletRequest request = (HttpServletRequest) req;response.setHeader("Access-Control-Allow-Origin", "http://localhost:8080");response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Max-Age", "3600");chain.doFilter(req, res);}
}

上述代码中,在上述代码中,我们设置了Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Max-Age以及Access-Control-Allow-Headers等响应头信息。其中Access-Control-Allow-Origin设置为"*"表示允许所有来源进行访问,Access-Control-Allow-Methods指定了支持的HTTP请求方法,Access-Control-Max-Age设置预检请求的有效期时间,Access-Control-Allow-Headers设置了允许携带的请求头。

六、代码示例

前端代码:

为了演示跨域请求的处理,我们可以使用前端技术来发送一个跨域请求,例如使用JavaScript中的XMLHttpRequest对象。下面是一个简单的HTML页面,用来演示如何发送跨域请求:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>跨域请求示例</title>
</head>
<body><button onclick="sendRequest()">发送请求</button><div id="result"></div><script>function sendRequest() {var xhr = new XMLHttpRequest();xhr.open('GET', 'http://localhost:8080/api/hello', true);xhr.onreadystatechange = function() {if (xhr.readyState == 4 && xhr.status == 200) {document.getElementById('result').innerText = xhr.responseText;}};xhr.send();}</script>
</body>
</html>

在这个HTML页面中,我们定义了一个按钮和一个用于显示请求结果的div元素。当用户点击按钮时,将会发送一个跨域请求到我们在SpringBoot中定义的/api/hello路径。

后端后端:

@RestController
@RequestMapping("/api")
public class ApiController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}
}

在上面的示例中,我们定义了一个名为ApiController的控制器类,并在其中定义了一个名为sayHello()的GET请求处理方法。这个方法将返回一个简单的字符串消息。快使用本文中介绍的三种解决跨域的方式实现一下吧。

总结

在SpringBoot中,我们可以通过添加一些配置来解决跨域问题,包括使用@CrossOrigin注解、配置WebMvcConfigurer、使用Filter接口等方式。具体选择哪种方式,需要根据具体场景和需求进行选择。同时,我们还需要注意一些跨域安全问题,如CSRF攻击等。
总之,跨域问题在Web开发中是一个常见的问题,解决起来也比较复杂。但只要了解了跨域问题的原理和解决方案,就能够在实际开发中更好地应对和解决这个问题。

跨域问题详解及解决方案相关推荐

  1. SpringBoot—CORS跨域问题详解和解决方案

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在前后端开发过程中,遇到过一种错误,类似于报错: Access to XMLHttpRequest at 'http://127 ...

  2. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  3. proxytable代理不生效_proxyTable代理跨域使用详解

    这次给大家带来proxyTable代理跨域使用详解,proxyTable代理跨域使用的注意事项有哪些,下面就是实战案例,一起来看一下. 什么是代理跨域 浏览器之间有同源策略,出于安全考虑不同域之间不允 ...

  4. 2023-01-20 网工进阶(三十九)MPLS 虚拟专用网络---概述、路由交互、CE接入PE方法、基本组网方案详解、团体属性、防环、MCE组网、伪连接方案、跨域组网详解、各种组网方案配置举例

    概述 VPN(Virtual Private Network,虚拟专用网络)指的是在一个公共网络中实现虚拟的专用网络,从而使得用户能够基于该专用网络实现通信的技术.MPLS VPN也是VPN技术中的一 ...

  5. vue-admin-template解决跨域问题详解

    vue-admin-template入门详解(后端springboot+sprngsecurity+jwt+redis) 自&如 2020-05-10 23:25:09 1232 收藏 10 ...

  6. jsonp 跨域原理详解

    转载至:http://zha-zi.iteye.com/blog/1975116 JavaScript是一种在Web开发中经常使用的前端动态脚本技术.在JavaScript中,有一个很重要的安全性限制 ...

  7. gorilla websocket无法跨域_聊聊浏览器同源策略与跨域方案详解

    开发出高性能的 Web 应用固然重要,但安全问题也不容小觑.本文我们继续以 HTTP 为线索,展开来讲一讲浏览器安全相关的同源策略. 浏览器的同源策略(Same Origin Policy) 源(Or ...

  8. Ajax 跨域请求详解

    问题描述: 实际开发中,我们经常会看到这样的错误提示: XMLHttpRequest cannot load http://-- No 'Access-Control-Allow-Origin' he ...

  9. 跨域问题详解——九种解决跨域方法

    跨域是前端再常见不过的问题了,下面主要针对跨域做一次总结,一次理清楚. 一.jsonp解决跨域 jsonp解决跨域问题的原理是:script不受同源策略的影响. //前端代码: <!DOCTYP ...

最新文章

  1. 电力电子技术第五版王兆安pdf_电力电子技术笔记(考试必备)
  2. 如何书写高质量的jQuery代码
  3. Vue使用全局样式,页面没有发生变化:逗号是中文的,引起错误,样式不变化 也没有报错就是不起作用
  4. SAP Hybris WCMS cockpit 的登录 url
  5. 如何理解 ListT和 DictionaryK,V 的扩容机制 ?
  6. Web笔记-移动前端开发笔记
  7. 线程池的执行原则及配置参数详解
  8. eclipse 配置Maven问题解决办法:新建maven工程时报错:Could not resolve archetype org.apache.maven.archetypes ....
  9. echarts 水桶注水式柱状图
  10. 没有完美,一切只是角度
  11. R语言中,保留含有特定字符的元素
  12. swoft使用phpunit之CodeCoverage
  13. 在Android studio环境下使用junit框架进行单元测试
  14. lvds输入悬空_MAX 10高速LVDS I/O用户指南
  15. 用python算股票β系数_请教达人:Stata中计算多只股票月度beta系数的do文件怎么编写?...
  16. 网站外链如何才能被搜索引擎快速收录呢?
  17. 新一配:文言文也能编程?该项目在GitHub摘得5500星
  18. ipad 视频播放器的渐变播放效果
  19. 基辛格等分享: ChatGPT 预示着一场智能革命,而人类还没有准备好
  20. iview表格表头上添加icon图标

热门文章

  1. Hadoop日志分析系统
  2. SysTick-系统定时器
  3. 网上打印资料选哪个平台打印比较划算?
  4. 新版支付宝能否革了微信的命
  5. Java 覆盖率相关实践总结
  6. SphereEx 一周年:保持热爱,奔赴下一场『云』海
  7. 光的干涉衍射计算机模拟仿真技术,实验报告之仿真(光的干涉与衍射).doc
  8. 预算500~1000元,新手入门吉他应该怎么选?
  9. Android 计量单位
  10. springboot毕设项目仓库管理oni4h(java+VUE+Mybatis+Maven+Mysql)