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 相关文章推荐
用cssText批量修改样式
Aug 29 Javascript
Jquery ThickBox插件使用心得(不建议使用)
Sep 08 Javascript
基于JQuery的简单实现折叠菜单代码
Sep 15 Javascript
jQuery源码分析-01总体架构分析
Nov 14 Javascript
Bootstrap选项卡与Masonry插件的完美结合
Jul 06 Javascript
微信小程序 教程之WXSS
Oct 18 Javascript
vue-cli中的webpack配置详解
Sep 25 Javascript
vue自定v-model实现表单数据双向绑定问题
Sep 03 Javascript
VUE 组件转换为微信小程序组件的方法
Nov 06 Javascript
vue滑动吸顶及锚点定位的示例代码
May 10 Javascript
使用vue3重构拼图游戏的实现示例
Jan 25 Vue.js
ES6的循环与可迭代对象示例详解
Jan 31 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
PHP队列用法实例
2014/11/05 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
共享自己写一个框架DreamScript
2007/01/20 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
node.js中的querystring.unescape方法使用说明
2014/12/10 Javascript
浅谈nodeName,nodeValue,nodeType,typeof 的区别
2015/01/13 Javascript
JavaScript实现按照指定长度为数字前面补零输出的方法
2015/03/19 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
django站点管理详解
2017/12/12 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python中format()格式输出全解
2019/04/12 Python
eHarmony英国:全球领先的认真恋爱约会平台之一
2020/11/16 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
公司财务工作总结的自我评价
2013/11/23 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Python多线程实用方法以及共享变量资源竞争问题
2022/04/12 Python