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 相关文章推荐
js限制文本框为整数和货币的函数代码
Oct 13 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
简单的Jquery遮罩层代码实例
Nov 14 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
Oct 14 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
js剪切板应用clipboardData实例解析
May 29 Javascript
canvas仿iwatch时钟效果
Mar 06 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
Aug 14 jQuery
vue柱状进度条图像的完美实现方案
Aug 26 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 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
mysq GBKl乱码
2006/11/28 PHP
php 数组二分法查找函数代码
2010/02/16 PHP
PHP如何通过AJAX方式实现登录功能
2015/11/23 PHP
修改PHP脚本使WordPress拦截垃圾评论的方法示例
2015/12/10 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
另类调用flash无须激活的方法
2006/12/27 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
node.js中的path.join方法使用说明
2014/12/08 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
python使用nntp读取新闻组内容的方法
2015/05/08 Python
python如何对实例属性进行类型检查
2018/03/20 Python
Python3多线程操作简单示例
2018/05/22 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
pytorch 在sequential中使用view来reshape的例子
2019/08/20 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python中安装django模块的方法
2020/03/12 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
聚美优品励志广告词
2014/03/14 职场文书
导游个人求职信范文
2014/03/23 职场文书
初三班主任寄语大全
2014/04/04 职场文书
新春寄语大全
2014/04/09 职场文书
农业开发项目建议书
2014/05/16 职场文书
新闻发布会活动策划方案
2014/09/15 职场文书
火烧圆明园观后感
2015/06/03 职场文书
观看《信仰》心得体会
2016/01/15 职场文书
php 获取音视频时长,PHP 利用getid3 获取音频文件时长等数据
2021/04/01 PHP
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang
Python+Tkinter打造签名设计工具
2022/04/01 Python