ajax 查询中 Java + Spring 的 CORS 策略错误

Posted

技术标签:

【中文标题】ajax 查询中 Java + Spring 的 CORS 策略错误【英文标题】:CORS policy error with Java + Spring in an ajax query 【发布时间】:2020-06-03 11:01:42 【问题描述】:

在 ubuntu 操作系统中使用 Java 11、eclipse、Gradle 和 spring

虽然我的 POST 调用工作正常,但由于 CORS 策略,对服务器的 GET 调用被阻止并出现以下错误:

通过“http://localhost:8080/dices/players?”访问 XMLHttpRequest 来自原点“http://localhost”已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

POST 和 GET 调用的 javascript 是:

$(document).ready(function()
    $('#newUserButton').click(function()
        $.ajax(
            type: 'POST',
            url: 'http://localhost:8080/dices/players',
            contentType: 'application/json',
            xhrFields:  withCredentials: true ,
            data: JSON.stringify("name":$('#newUserInput').val()),
            dataType: 'json',
            success: function(data) 
                $('#newUserJumbo').append('<div class="alert alert-success" role="alert">El usuari ' + data.name + ' ha estat creat</div>');
                ,
            error: function(e)
                console.log(e);
            
        );
    );
);

$(document).ready(function()
    $('#searchUserButton').click(function()
        $.ajax(
            type: 'GET',
            url: 'http://localhost:8080/dices/players',
            contentType: 'application/json',
            xhrFields:  withCredentials: true ,
            data: JSON.stringify("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);
            
        );
    );
);

为了在服务器端处理 CORS,我使用了我在 mozilla mdnwebDoc here 中找到的以下类,该类在 POST 调用中运行良好,但在 GET 上失败

处理GET调用的代码如下:

    @CrossOrigin(origins = "http://lvh.me:8080")
    @GetMapping("/players/player")
    public Player getPlayer(@RequestBody Player newPlayer)
        try 
            return (Player) repository.findFirstByNameLike(newPlayer.getName());
         catch (EmptyResultDataAccessException e) 
            throw new PlayerNotFoundException(newPlayer.getName());

更新 1

正如 Albert 评论的那样,我已将 http://localhost 更改为 http://lvh.me 以查看代码是否有效,但没有退出。 我还编辑了从@PathVariable 更改为@RequestBody 的控制器代码(因为我对具有json 主体的同一个控制器的POST 请求正在工作)也有效。 最后,感谢 Kevin cmets,我还改变了处理 CORS 策略的方式,从全局方法到控制器方法,也没有退出。 我已更改上面的代码以反映此更改。

欢迎任何 cmets 和建议。谢谢 谢谢

【问题讨论】:

【参考方案1】:

您可以使用以下方法专门为该端点启用 CORS:

@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/players/idPlayer")
public Player getPlayer(@PathVariable Integer idPlayer)
    try 
        return (Player) repository.findById(idPlayer);
     catch (EmptyResultDataAccessException e) 
        throw new PlayerNotFoundException(idPlayer);
    

如果您想在全局级别解决 CORS,您需要使用您的 main 方法在类中创建一个 WebMvcConfigurer bean:

@SpringBootApplication
public class YourApplication 

    @Bean
    public WebMvcConfigurer corsConfigurer() 
        return new WebMvcConfigurer() 
            @Override
            public void addCorsMappings(CorsRegistry registry) 
                registry.addMapping("/**").allowedOrigins("http://localhost:8080");
            
        ;
    

【讨论】:

感谢@Kevin,当我让 POST 调用正常工作时,我已经删除了 WebMvcConfigurer,因为我认为在使用 simpleCorsFilter() 类时没有必要这样做。我已将其再次添加到应用程序,但服务器返回相同的错误“Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at localhost:8080/dices/players?。(原因:CORS 预检响应未成功)。”

以上是关于ajax 查询中 Java + Spring 的 CORS 策略错误的主要内容,如果未能解决你的问题,请参考以下文章

ssm框架 怎么用ajax查询从数据库读取数据 返回json格式

基于Spring+SpringMVC+MyBatis开发书评网图书分页查询模块采用Ajax动态加载图书信息和实现图书多条件动态查询

java中的struts2+spring+Hibernate整合的框架中如何使用Ajax完成用户注册的用户名重复

java 通过ajax将json发布到Spring资源

求教Spring mvc 处理 ajax问题,在线等

java spring boot将字符串数组作为json中的参数传递给ajax调用