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 一段左右两边随屏滚动的代码
Jun 18 Javascript
Javascript 通过json自动生成Dom的代码
Apr 01 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
JavaScript实现梯形乘法表的方法
Apr 25 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
Oct 09 Javascript
js实现文字选中分享功能
Jan 25 Javascript
Javascript实现数组中的元素上下移动
Apr 28 Javascript
angularjs $http实现form表单提交示例
Jun 09 Javascript
Angular中的ng-template及angular 使用ngTemplateOutlet 指令的方法
Aug 08 Javascript
js实现三角形粒子运动
Sep 22 Javascript
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
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将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
PHP微信开发之微信消息自动回复下所遇到的坑
2016/05/09 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
超级好用的jQuery圆角插件 Corner速成
2014/08/31 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
jquery表单插件form使用方法详解
2017/01/20 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Windows下安装python2.7及科学计算套装
2015/03/05 Python
python学习之编写查询ip程序
2016/02/27 Python
Python 调用Java实例详解
2017/06/02 Python
Python实现图片转字符画的示例
2017/08/22 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
Django REST framwork的权限验证实例
2020/04/02 Python
用python按照图像灰度值统计并筛选图片的操作(PIL,shutil,os)
2020/06/04 Python
Python常用类型转换实现代码实例
2020/07/28 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
七年级地理教学反思
2014/01/26 职场文书
吸烟检讨书2000字
2014/02/13 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
早恋主题班会
2015/08/14 职场文书
python代码实现备忘录案例讲解
2021/07/26 Python
Python语言内置数据类型
2022/02/24 Python
改造DE1103三步曲
2022/04/07 无线电
三星 3nm 芯片将于第二季度开始量产
2022/04/29 数码科技