Ubuntu环境下Java11+Spring项目GET请求遭CORS拦截问题求助
看起来你遇到的问题是路径不匹配、GET请求参数传递错误和CORS配置origin不匹配三者叠加导致的,咱们一步步拆解解决:
1. 先修复核心问题:前后端接口路径不匹配
你前端GET请求的URL是:
url: 'http://localhost:8080/dices/players'
但后端的接口注解是:
@GetMapping("/players/player")
两者路径完全不匹配!Spring找不到对应的接口,自然返回的响应里没有CORS头,直接触发拦截。
首先把后端路径改成和前端一致:
@GetMapping("/dices/players")
2. 修正GET请求的参数传递与后端接收逻辑
你的前端GET请求用JSON.stringify把参数放到请求体,后端用@RequestBody接收:
data: JSON.stringify({"idPlayer":$('searchUserInput').val()})
public Player getPlayer(@RequestBody Player newPlayer)
但GET请求默认没有请求体,浏览器会把参数拼到URL查询参数里(比如?idPlayer=xxx),而@RequestBody是从请求体解析数据,所以后端根本拿不到参数,这种不符合HTTP规范的请求也容易触发CORS预检拦截。
修正方案:
前端:去掉JSON.stringify,直接传参数对象(jQuery会自动转成查询参数)
另外注意你代码里$('searchUserInput')少了#,应该是$('#searchUserInput'):
$(document).ready(function(){ $('#searchUserButton').click(function(){ $.ajax({ type: 'GET', url: 'http://localhost:8080/dices/players', // GET请求不需要contentType(默认是application/x-www-form-urlencoded) // contentType: 'application/json', xhrFields: { withCredentials: true }, // 直接传对象,jQuery会自动转为URL查询参数 data: {"idPlayer":$('#searchUserInput').val()}, dataType: 'json', success: function(data) { $('#modifyUserUl').append('<button type="button" class="list-group-item list-group-item-action" id="' + data.id + '" onclick="modifyUser(' + data.id + ')">id: ' + data.id + ', nom: ' + data.name + '</button>'); }, error: function(e){ console.log(e); } }); }); });
后端:改用@RequestParam接收查询参数
@CrossOrigin(origins = "http://localhost") // 改成和前端origin一致的地址 @GetMapping("/dices/players") public Player getPlayer(@RequestParam("idPlayer") Long idPlayer){ // 假设idPlayer是Long类型 try { return repository.findFirstById(idPlayer); // 对应你的查询逻辑,按ID查询 // 如果需要按name查询,就改成@RequestParam("name") String name,前端传name参数即可 } catch (EmptyResultDataAccessException e) { throw new PlayerNotFoundException(idPlayer.toString()); } }
3. 确保CORS配置的origin和前端实际origin一致
从报错信息能看到前端的origin是http://localhost,但你之前的@CrossOrigin设置的是origins = "http://lvh.me:8080",完全不匹配,所以Spring不会返回正确的Access-Control-Allow-Origin头,导致CORS拦截。
不管用控制器级别的@CrossOrigin还是全局配置,都要把origin设置成前端实际的地址:
- 如果前端是
http://localhost(默认80端口),就写@CrossOrigin(origins = "http://localhost") - 如果前端有自定义端口(比如
http://localhost:8081),就写对应的完整地址
4. (可选)全局CORS配置更省心
如果有多个接口需要处理CORS,全局配置比逐个控制器加注解更方便,给你一个正确的全局配置示例:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; @Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); // 允许的origin,和前端实际地址一致 config.addAllowedOrigin("http://localhost"); // 允许携带凭证(对应前端的withCredentials: true) config.setAllowCredentials(true); // 允许所有请求方法 config.addAllowedMethod("*"); // 允许所有请求头 config.addAllowedHeader("*"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); // 对所有路径生效 source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } }
用了全局配置后,控制器上的@CrossOrigin可以去掉,避免配置冲突。
最后验证步骤
- 重启Spring Boot应用,确保新配置生效
- 打开浏览器控制台,查看GET请求的预检OPTIONS请求和实际请求的响应头,确认包含
Access-Control-Allow-Origin: http://localhost - 测试GET请求,验证是否能正常返回数据
内容的提问来源于stack exchange,提问作者Raul Magdalena Catala

