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常见用法总结
May 22 Javascript
分享一个自己动手写的jQuery分页插件
Aug 28 Javascript
ie8下修改input的type属性报错的解决方法
Sep 16 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
jQuery实现从身份证号中获取出生日期和性别的方法分析
Feb 25 Javascript
angular2使用简单介绍
Mar 01 Javascript
JavaScript是如何实现继承的(六种方式)
Mar 31 Javascript
canvas绘制七巧板
Feb 03 Javascript
微信小程序 仿猫眼实现实例代码
Mar 14 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
Jun 13 Javascript
关于layui toolbar和template的结合使用方法
Sep 19 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 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高手需要要掌握的知识点
2014/08/21 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JQuery中each()的使用方法说明
2010/08/19 Javascript
JavaScript 产生不重复的随机数三种实现思路
2012/12/13 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
浅谈Javascript的静态属性和原型属性
2015/05/07 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
vue移动端弹框组件的实例
2018/09/25 Javascript
vue项目中在外部js文件中直接调用vue实例的方法比如说this
2019/04/28 Javascript
解决Can't find variable: SockJS vue项目的问题
2020/09/22 Javascript
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
python使用socket创建tcp服务器和客户端
2018/04/12 Python
python 筛选数据集中列中value长度大于20的数据集方法
2018/06/14 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python列表每个元素同增同减和列表元素去空格的实例
2019/07/20 Python
django使用admin站点上传图片的实例
2019/07/28 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
CSS3 实现图形下落动画效果
2020/11/13 HTML / CSS
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
Interhome丹麦:在线预订度假屋和公寓
2019/07/18 全球购物
电脑售后服务承诺书
2014/03/27 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
铣工实训报告
2014/11/05 职场文书
《领导干部从政道德启示录》学习心得体会
2016/01/20 职场文书
JavaCV实现照片马赛克效果
2022/01/22 Java/Android
Redis如何实现验证码发送 以及限制每日发送次数
2022/04/18 Redis