无法从简单的 Ajax 函数调用 Spring Boot RestController 中的 GET 方法

Posted

技术标签:

【中文标题】无法从简单的 Ajax 函数调用 Spring Boot RestController 中的 GET 方法【英文标题】:Can't call a GET method in a Spring Boot RestController from a simple Ajax function 【发布时间】:2021-10-07 11:27:24 【问题描述】:

我在 Ububtu 服务器(在 Azure 中)的 Spring Boot(版本 2.1.6.RELEASE)中有一个 RestController。

Ubuntu 信息:

说明:Ubuntu 18.04.5 LTS, 发布:18.04, 代号:仿生

我的 RestController 有一个具有此定义的 GET 方法:

   @RequestMapping(value = "/universidades_por_prioridad", method = RequestMethod.GET)
   public Collection<UniversidadEntity> obtenerTodasPorPrioridad() 
      return universidadService.obtenerTodasPorPrioridad();
   

该方法返回一个大学集合(该列表是从数据库中获取的)

我也有这个 CORS 配置

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer 

   private static final Logger LOG = LoggerFactory.getLogger(CorsConfig.class);

   @Override
   public void addCorsMappings(CorsRegistry registry) 
      LOG.info("Adding CORS Mapping");
      registry.addMapping("/**").allowedOrigins("http://localhost").allowedMethods("PUT", "DELETE", "POST", "GET")
            .allowCredentials(false).maxAge(3600);

      // here I put the public server IP
      registry.addMapping("/**").allowedOrigins("http://52.XXX.XXX.XXX").allowedMethods("PUT", "DELETE", "POST", "GET")
            .allowCredentials(false).maxAge(3600);
   

   @Override
   protected void configure(HttpSecurity http) throws Exception 
      LOG.info("Disabling CORS");
      http.cors().and().csrf().disable() //
            .authorizeRequests().antMatchers("/**") //
            .access("hasIpAddress(\"127.0.0.1\") or hasIpAddress(\"::1\") or hasIpAddress(\"::9002\")") //
      ; //
   


我在 php 中有一个 Ajax,它通过 GET 调用 Rest。

我的 Ajax 调用这个 GET 如下:

jQuery.ajax(
    url: 'http://localhost:9002/universidades_por_prioridad',
    type: 'get',
    cache: false,
    async: true,
    dataType: 'json',
    success: function(universidades) 
        console.log(universidades);     
    
);

我的 Spring Boot 配置为在端口 9002 中运行。

application.properties 如下:

server.port=9002
server.address=localhost

两个模块都在同一个服务器中(都在 Azure 中的 Ubuntu 服务器中)。

如果我在服务器的命令行中执行 CURL,它会返回带有大学列表的 JSON。

curl -i http://localhost:9002/universidades_por_prioridad

HTTP/1.1 200
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Mon, 02 Aug 2021 03:04:46 GMT
[THE JSON]

但是从 Ajax 中我无法访问该方法。

Chrome DevTools 显示:

GET http://localhost:9002/universidades_por_prioridad?_=123456789 net::ERR_CONNECTION_REFUSED

Firefox DevTools 显示:

跨源请求被阻止:同源策略不允许读取位于 http://localhost:9002/universidades_por_prioridad?_=123456789 的远程资源。 (原因:CORS 请求未成功)。

我找到了很多页面来做我的配置,但在这个服务器上是不可能的。

在我的装有 Windows 10 的计算机上它可以正常工作,但在 Ubuntu(通常在 Linux 中)我无法让它工作。

其他信息:

Java 版本:1.8.0_292

PHP 版本:7.2.24

我是否还必须从我的 PHP 模块中修改 .htaccess 中的某些内容?

请告诉我我需要什么或缺少什么。 谢谢。

【问题讨论】:

【参考方案1】:

你能在你的控制器方法中添加@CrossOrigin注解,然后像下面这样重试。

@CrossOrigin
@RequestMapping(value = "/universidades_por_prioridad", method = 
RequestMethod.GET)
public Collection<UniversidadEntity> obtenerTodasPorPrioridad() 
   return universidadService.obtenerTodasPorPrioridad();

【讨论】:

嗨,我已经在方法或控制器类中尝试了注解@CrossOrigin,但请求没有考虑到这一点。它的工作原理相同。我认为这是请求中的问题。我必须在 Ajax 请求标头中添加一些内容,但找不到解决方案。

以上是关于无法从简单的 Ajax 函数调用 Spring Boot RestController 中的 GET 方法的主要内容,如果未能解决你的问题,请参考以下文章

Jquery datatable 在从简单的 Web 服务调用 Web 方法时未在表中显示任何数据

从简单的三角形开始

Spring Security 入门 我们在篇中已经谈到了默认的登录页面以及默认的登录账号和密码。 在这一篇中我们将自己定义登录页面及账号密码。 我们先从简单的开始吧:设置自定

从简单的 XML 文件中提取数据

PowerShell 从简单的 .ini 文件中读取单个值

将数据从简单的 NSView 传递到 SwiftUI 视图