You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu环境下Java11+Spring项目GET请求遭CORS拦截问题求助

解决Spring Boot中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可以去掉,避免配置冲突。

最后验证步骤

  1. 重启Spring Boot应用,确保新配置生效
  2. 打开浏览器控制台,查看GET请求的预检OPTIONS请求和实际请求的响应头,确认包含Access-Control-Allow-Origin: http://localhost
  3. 测试GET请求,验证是否能正常返回数据

内容的提问来源于stack exchange,提问作者Raul Magdalena Catala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 18:04:04