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 相关文章推荐
JQueryEasyUI Layout布局框架的使用
Apr 08 Javascript
javascript解决innerText浏览器兼容问题思路代码
May 17 Javascript
jquery实现div阴影效果示例代码
Sep 16 Javascript
Javascript基础教程之比较null和undefined值
May 16 Javascript
原生js实现class的添加和删除简单代码
Jul 12 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
微信小程序 rpx 尺寸单位详细介绍
Oct 13 Javascript
React数据传递之组件内部通信的方法
Dec 31 Javascript
js实现一个页面多个倒计时的3种方法
Feb 25 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
解决vue自定义全局消息框组件问题
Nov 22 Javascript
vue3.0生命周期的示例代码
Sep 24 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 处理图片的类实现代码
2009/10/23 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
2016/01/15 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
在每个匹配元素的外部插入新元素的方法
2013/12/20 Javascript
JQuery中操作Css样式的方法
2014/02/12 Javascript
JavaScript实现简单的二级导航菜单实例
2015/04/15 Javascript
JS中call/apply、arguments、undefined/null方法详解
2016/02/15 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
JavaScript仿微信打飞机游戏
2020/07/05 Javascript
Angular项目从新建、打包到nginx部署全过程记录
2017/12/09 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
在Python下尝试多线程编程
2015/04/28 Python
详解Python中的四种队列
2018/05/21 Python
Python线程同步的实现代码
2018/10/03 Python
Python实现获取系统临时目录及临时文件的方法示例
2019/06/26 Python
python保留小数位的三种实现方法
2020/01/07 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python print不能立即打印的解决方式
2020/02/19 Python
python 安装impala包步骤
2020/03/28 Python
建筑专业毕业生推荐信
2013/11/21 职场文书
函授毕业生的自我鉴定
2013/11/26 职场文书
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
《识字五》教学反思
2014/03/01 职场文书
“九一八事变纪念日”国旗下讲话稿
2014/09/14 职场文书
党员个人党性分析材料
2014/12/18 职场文书
大学生暑期社会实践的个人总结!
2019/07/17 职场文书
前端vue+express实现文件的上传下载示例
2022/02/18 Vue.js
零基础学java之方法的定义与调用详解
2022/04/10 Java/Android