vue+springboot实现项目的CORS跨域请求

作者:小猪zsz 时间:2024-05-09 09:48:23 

跨域资源共享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请求的过程正如预期。希望对大家的学习有所帮助,也希望大家多多支持asp之家。

来源:https://blog.csdn.net/u014084956/article/details/80499969

标签:vue,springboot,跨域
0
投稿

猜你喜欢

  • selenium IDE自动化测试脚本的实现

    2023-06-29 18:46:11
  • vue使用v-for实现hover点击效果

    2024-05-02 17:09:03
  • SQLSERVER记录登录用户的登录时间(自写脚本)

    2024-01-27 15:07:24
  • python解决pandas处理缺失值为空字符串的问题

    2021-10-21 09:01:38
  • Python 聊聊socket中的listen()参数(数字)到底代表什么

    2022-10-17 00:49:25
  • C# 以MDF文件链接数据库的示例代码

    2024-01-21 09:38:18
  • Python3中的json模块使用详解

    2021-09-27 22:21:22
  • 解析SQL Server中数据库快照的工作原理

    2009-02-19 17:04:00
  • 详解MySQL监控工具 mysql-monitor

    2024-01-25 23:03:16
  • 基于Python正确读取资源文件

    2022-04-10 11:34:18
  • PHP的RSA加密解密方法以及开发接口使用

    2023-07-13 06:09:20
  • 介绍Python的Django框架中的QuerySets

    2021-04-19 18:58:32
  • MySQL 百万级分页优化(Mysql千万级快速分页)

    2024-01-22 02:43:26
  • go格式“占位符”输入输出 类似python的input

    2021-04-23 21:32:18
  • CSS雪碧:要还是不要?

    2009-11-16 13:01:00
  • Mysql数据库的主从复制与读写分离精讲教程

    2024-01-13 14:06:08
  • Python实现电视里的5毛特效实例代码详解

    2023-03-18 00:03:46
  • Python根据欧拉角求旋转矩阵的实例

    2022-09-03 15:11:00
  • 利用Python实现最小二乘法与梯度下降算法

    2021-07-19 03:59:49
  • Golang爬虫框架colly使用浅析

    2024-02-06 23:28:06
  • asp之家 网络编程 m.aspxhome.com