使用AJAX调用SpringBoot控制器遭遇CORS错误,求解决方案
解决AJAX调用SpringBoot控制器的CORS错误及请求不匹配问题
首先,你遇到的CORS错误加上请求失败,其实是几个小问题凑到一起了,我帮你一步步拆解并修复:
错误根源分析
- 请求方法不匹配:你的JavaScript里用的是
GET请求,但SpringBoot控制器上标注的是@PostMapping("/print"),两者完全不对应,这会导致服务器无法正确处理请求,进而引发CORS预请求失败。 - 错误设置请求头:你在AJAX里加了
headers: { 'Access-Control-Allow-Origin': '*' },但这个头是服务器返回给客户端的响应头,不是客户端发给服务器的请求头,加在这里完全没用,反而可能干扰请求逻辑。 - GET请求的参数传递错误:即使你想用GET请求,
JSON.stringify(data)也不是GET请求传递参数的正确方式——GET参数应该是URL拼接的键值对,而非JSON格式的请求体。
具体修复步骤
- 修正请求方法:把AJAX里的
type: "GET"改成type: "POST",和控制器的@PostMapping保持一致。 - 移除错误的请求头:删掉AJAX配置里的
headers那一行。 - 确保参数传递正确:因为控制器用了
@RequestBody,所以POST请求里用JSON.stringify(data)传递JSON体是正确的,同时保持contentType: "application/json"不变。
修改后的代码示例
调整后的JavaScript代码
database.on('child_added', function (snapshot) { var data = {}; data["CaptainName"] = snapshot.val().CaptainName; data["CookName"] = snapshot.val().CookName; data["LogicalConditions"] = snapshot.val().LogicalConditions; $.ajax({ type: "POST", // 改成POST请求,匹配控制器注解 contentType: "application/json", url:"my-localhost/application/print", data: JSON.stringify(data), dataType: 'json', cache: false, success: function(){ console.log("Successfully sent payload") }, error: function(e){ console.log("Error:" , e) } }); });
控制器代码(现有配置已正确,无需修改)
@CrossOrigin(origins = "*", allowedHeaders = "*") @RestController @RequestMapping("/application") public class AppController { @PostMapping("/print") public void print(@RequestBody String st) { System.out.println(st); } }
额外优化建议
如果之后多个接口都需要处理CORS问题,可以考虑在SpringBoot里配置全局CORS过滤器,这样不用每个控制器都加@CrossOrigin注解,示例代码如下:
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
内容的提问来源于stack exchange,提问作者Vai
相关产品推荐
相关产品推荐

