vue+springboot实现项目的CORS跨域请求


Posted in Javascript onSeptember 05, 2018

跨域资源共享CORS(Cross-origin Resource Sharing),是W3C的一个标准,允许浏览器向跨源的服务器发起XMLHttpRequest请求,克服ajax请求只能同源使用的限制。关于CORS的详细解读,可参考阮一峰大神的博客:跨域资源共享CORS详解。本文为通过一个小demo对该博客中分析内容的一些验证。

1.springboot+vue项目的构建和启动

细节不在此赘述,任何简单的springboot项目就可以,而前端vue项目只需用axios发ajax请求即可。

我的demo里填写用户名和密码,然后点击登录按钮向后台发起登录请求,js代码如下:

methods:{
     login:function() {
      //var userParams = this.$qs.stringify(this.User);
       /* var userParams = JSON.stringify(this.User);*/
       this.$axios.post("http://localhost:8080/login",this.User).then(res=>{
       alert(res.data);
      });
     }
   }

后台控制器部分,对登录请求的处理:

/*CORS设置方法1:@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)*/
  @RequestMapping(value="/login",method = RequestMethod.POST, produces = "application/json;charset=UTF-8" )
  @ResponseBody
  public String userlogin(@RequestBody JSONObject user) {
		/*String name=request.getParameter("name");
		String password=request.getParameter("password");*/
		System.out.println("name: " + user.get("name"));
		System.out.println("password: " + user.get("password"));
		String name = (String) user.get("name");
		String password = (String) user.get("password");
  	if(name.equals("zsz") && password.equals("888888")){ 		
			return "login success!";
		}else{
			return "login failed";
		}
  }

后台以8080端口启动,前台以8081启动,此时无法跨域,浏览器控制台会报错:

vue+springboot实现项目的CORS跨域请求

2.springboot设置CORS

此处主要有两种方法(但是貌似有其他博客还有更多种),在springboot中实现都比较简单(反正springboot好像就是各种省事各种简单)。

方法1:

@CrossOrigin(origins = "http://localhost:8081", maxAge = 3600)

直接在控制器方法前注解,设置可以跨域的源ip和端口,以及预检有效期maxAge等参数。

方法2:

编写配置类,配置全局的CORS设置。

@Configuration
public class MyCorsConfig {	
	@Bean
	public WebMvcConfigurer corsConfigurer(){
	 return new WebMvcConfigurerAdapter() {
      @Override
      public void addCorsMappings(CorsRegistry registry) {
        // 限制了路径和域名的访问
        /*registry.addMapping("/api*").allowedOrigins("http://localhost:8081");*/
       registry.addMapping("/**")
        .allowedOrigins(ALL)
        .allowedMethods(ALL)
        .allowedHeaders(ALL)
        .allowCredentials(true);
      }
    };
	}		
}

如果路径配置成以上的 /**则对所有源路径均接受跨域访问,当然也可以配置更详细的路径。

这样可以成功访问后台,浏览器中可以看到http请求和响应的结果如下图:

vue+springboot实现项目的CORS跨域请求

3.CORS非简单请求预检请求的抓包验证

根据阮一峰大神的博客所述,CORS简单请求只发送一次请求,服务器设置支持CORS则会在响应内容中添加Acess-Control-Allow-Origin等字段,否则不添加,浏览器知道出错,从而抛出异常;CORS非简单请求时,会先进行一次预检(preflight)请求,浏览器根据响应内容进行正式的XMLHttpRequest请求。

在我的demo中,我通过将http请求的 content-type 设置为application/json进行非简单请求。此处要说明一下,axios默认情况下发送请求的格式是application/json而不是我之前用jQuery发送ajax请求的application/x-www-form-urlencoded, 而我之前用的另一种方法构造查询字符串,最终发送请求的content-type会变为application/x-www-form-urlencoded。

var userParams = this.$qs.stringify(this.User)

前台请求代码如本文第一节中所示,在axios请求中直接传入User对象即可。在后端不设置CORS的时候,控制器信息为:

vue+springboot实现项目的CORS跨域请求

协议内容为:

vue+springboot实现项目的CORS跨域请求

而设置了CORS,预检请求结果为:

vue+springboot实现项目的CORS跨域请求

请求成功,并且在响应头中添加了各种字段。

再次发起XHR请求后,结果为:

vue+springboot实现项目的CORS跨域请求

以上实验验证证明了两种CORS请求的过程正如预期。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Event学习第五章 高级事件注册模型
Feb 07 Javascript
父元素与子iframe相互获取变量和元素对象的具体实现
Oct 15 Javascript
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
Feb 17 Javascript
JavaScript简单修改窗口大小的方法
Aug 03 Javascript
js实现tab选项卡切换功能
Jan 13 Javascript
jQuery实现 RadioButton做必选校验功能
Jun 15 jQuery
详解Vue组件之间的数据通信实例
Jun 17 Javascript
vue+element实现批量删除功能的示例
Feb 28 Javascript
使用异步组件优化Vue应用程序的性能
Apr 28 Javascript
如何通过javaScript去除字符串两端的空白字符
Feb 06 Javascript
jquery判断滚动条距离顶部的距离方法
Sep 05 #jQuery
jQuery实现基本淡入淡出效果的方法详解
Sep 05 #jQuery
jquery获取元素到屏幕四周可视距离的方法
Sep 05 #jQuery
js jquery 获取某一元素到浏览器顶端的距离实现方法
Sep 05 #jQuery
深入理解Vue 的钩子函数
Sep 05 #Javascript
jQuery实现基本隐藏与显示效果的方法详解
Sep 05 #jQuery
Spring boot 和Vue开发中CORS跨域问题解决
Sep 05 #Javascript
You might like
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
PHP提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
自己的js工具 Cookie 封装
2009/08/21 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
javascript显示倒计时控制按钮的简单实现
2016/06/07 Javascript
Bootstrap栅格系统学习笔记
2016/11/25 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
详解angularjs获取元素以及angular.element()用法
2017/07/25 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
把vue-router和express项目部署到服务器的方法
2018/02/21 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
Python实现获取命令行输出结果的方法
2017/06/10 Python
python中的变量如何开辟内存
2018/06/26 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
Python 一句话生成字母表的方法
2019/01/02 Python
Python实现的栈、队列、文件目录遍历操作示例
2019/05/06 Python
python config文件的读写操作示例
2019/09/27 Python
使用Python函数进行模块化的实现
2019/11/15 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
测绘工程本科生求职信
2013/10/10 职场文书
求职简历推荐信范文
2013/12/02 职场文书
合作协议书模板2014
2014/09/26 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server