Spring Boot对Ajax跨域访问的支持实现

作者在SE305课程中,需要设计一款新时代互联网购票系统,团队使用vue.js前端,Spring MVC的后台架构。开发过程中遇到跨域访问的问题,故写成此博客进行探讨解决方案。主要涉及的话题有:

  • Spring Boot
  • AJAX
  • 跨域访问

问题定义

究竟什么是跨域访问?作者引用了MDN对CORS的定义https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

当一个资源从与该资源本身所在的服务器的域或端口不同的域或不同的端口请求一个资源时,资源会发起一个跨域 HTTP 请求。
比如,站点 http://domain-a.com 的某 HTML 页面通过 的 src 请求
http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。
出于安全考虑,浏览器会限制从脚本内发起的跨域HTTP请求。例如,XMLHttpRequest 和 Fetch 遵循同源策略。因此,使用
XMLHttpRequest或 Fetch
的Web应用程序只能将HTTP请求发送到其自己的域。为了改进Web应用程序,开发人员要求浏览器厂商允许跨域请求。

下面是简单的流程图:

根本解决思路

客户端和服务器之间使用 CORS 首部字段来处理跨域权限:

也就是说在HTTP request以及response加入CORS对应的首部行字段即可解决。下面讲解在spring下的后台解决方案

实现方案

方案一

在Controller类或其方法上加@CrossOrigin注解

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/Cinema")
public class CinemaController {//Cinema控制器,跨域来源为*即任何来源
}

方案二

在web.xml中配置一个CorsFilter

<filter-mapping><filter-name>CorsFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

而filter的实现如下

@Component
public class InitCORSFilter extends OncePerRequestFilter {private Logger logger = LoggerFactory.getLogger(InitCORSFilter.class);public InitCORSFilter() {}//表示服务器端允许任意Domain访问请求@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {response.addHeader("Access-Control-Allow-Origin", "*");response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");response.addHeader("Access-Control-Allow-Headers", "origin, content-type, accept, x-requested-with, sid, mycustom, smuser");response.addHeader("Access-Control-Max-Age", "600");    //Max age为10mins}filterChain.doFilter(request, response);}}

方案三(本次项目使用的方法)

本次项目使用spring-boot,可以把CorsFilter作为@Bean加入到@Configuration中即可配置,方便简洁。

@Configuration
public class CorsConfig {private CorsConfiguration buildConfig() {CorsConfiguration corsConfiguration = new CorsConfiguration();corsConfiguration.addAllowedOrigin("*");corsConfiguration.addAllowedHeader("*");corsConfiguration.addAllowedMethod("*");return corsConfiguration;}@Beanpublic CorsFilter corsFilter() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", buildConfig()); return new CorsFilter(source);}
}//通过任意请求

总结

解决的不二思路就是当捕获到Cors请求(使用Filter实现)时,返回包含特定Header的Response。

Spring Boot对Ajax跨域访问的支持实现相关推荐

  1. spring boot 解决Ajax 跨域问题

    Ajax 跨域 请求 spring boot 的跨域问题 Ajax 跨域请求spring boot 时 前端报错 出现跨域错误 后端代码 @RequestMapping("/getArtic ...

  2. Spring Boot 对CORS跨域访问的配置

    Springboot 对于跨域请求的支持有两种配置方式: 一:注解配置 @CrossOrigin注解可以实现对CORS的启用. @RequestMapping("/get_api" ...

  3. apache ajax 跨域访问,AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 crossdomain.x ...

  4. Ajax跨域访问抱错 原因:CORS 头缺少 ‘Access-Control-Allow-Origin‘

    当Ajax跨域访问,明明已经获取到访问的json数据但是浏览器报错CORS 头缺少 'Access-Control-Allow-Origin' : 解决方式一: 过滤器 package com.xet ...

  5. Jetty Cross Origin Filter解决jQuery Ajax跨域访问的方法

    当使用jQuery Ajax post请求时可能会遇到类似这样的错误提示 XMLHttpRequest cannot load http://xxxxxx. Origin http://xxxxxx ...

  6. js Ajax跨域访问

    -----------------------index.html <html> <head> <title>JQuery Ajax跨域访问</title&g ...

  7. ie9以下兼容ajax跨域访问,解决ie9以下浏览器ajax请求报error拒绝访问方案 解决ie9以下浏览器ajax请求报400问题方案

    解决方案如下: 1.ie9以下兼容ajax跨域访问   2.ajax请求开始前添加 jQuery.support.cors = true;  允许跨域 3.ie浏览器设置允许通过域访问数据 并且 ur ...

  8. ajax总结(三):ajax跨域访问接口方法汇总

    ajax跨域访问接口方法和模板引擎的应用 一.学习跨域之前先要了解: 1.同源和跨域的概念 a.同源:协议头.域名.端口全部一样就叫同源; b.跨域:只要协议头,域名,端口任意一个不一样就是跨域. 因 ...

  9. jsonp跨域的缺点ajax缺点,浅析JSONP解决Ajax跨域访问问题的思路详解

    前几天,工作上有一新需求,需要前端web页面异步调用后台的Webservice方法返回信息.实现方法有多种,本例采用jQuery+Ajax,完成后,在本地调试了一切ok,但是部署到服务器上以后就出现问 ...

  10. Spring Boot 2.x 跨域问题(多种解决方式)

    参考:https://juejin.im/post/5d438becf265da03de3ae29f 什么是跨域 首先,我们需要了解一下一个URL是怎么组成的: // 协议 + 域名(子域名 + 主域 ...

最新文章

  1. 利用VSTS工具自动测试
  2. php把数组转换成对象,php怎么将数组转换成对象
  3. 车险赔付率分析报告_车险改革究竟是涨价还是降价了?9月19号后买会便宜吗?...
  4. android java显示_Android Studio没有显示java类源代码
  5. 卫星系统——酒店后端全链路日志收集工具介绍
  6. 12月14日习题答案大剖析!html5基础测试来啦
  7. 精心整理,kafka常见面试题,看这篇文章就够了(共17题,含详细解答)
  8. http服务器响应格式,熟悉Http协议的请求和响应格式,编写一个简单的Http服务器。 基本要求:1 正确解...
  9. 199-Pycharm相关
  10. 帝国cms后台不停的登录成功
  11. 用MyDiskTest检测存储卡真实容量(图)
  12. VS2017卡在登录界面问题
  13. 莫斯卡托葡萄酒的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. android 横竖屏幕切换
  15. 【笔记】分布式系统核心问题概述(二)
  16. 思科网络安全 第十一章测验答案
  17. 在Android中sidebar控件使用,Android控件--侧边栏SideBar
  18. 电子海图开发第四十九篇 船舶综合导航系统的设计(共一百篇)
  19. matlab 渲染效果,MATLAB-MATLAB 已通过改用 OpenGL 软件禁用了某些高级的图形渲染
  20. viso画图如何调整尺寸大小及设置打印【viso使用技巧篇】

热门文章

  1. 32个FPGA开源网站
  2. 阴历阳历相互转换c代码
  3. java 有多少种锁_java有哪些锁?java锁种类盘点
  4. 在线支付功能的设计及其实现
  5. 暑假将至,人贩子猖狂
  6. sharkle里的链接
  7. 各种品牌手机话机解锁秘籍
  8. 编程差的程序员,90%都是吃了数学的亏!骨灰级开发:方法不对,努力也白费...
  9. [维修案例] 艾美特电风扇(FS4085R)不能调风量维修
  10. 黑苹果音频卡顿_DXOMARK公布无线音箱音质基准:苹果华为Sonos上榜