使用resttemplate访问时,如何使端点仅接受springboot中启用@crossorigin的uri?为啥我没有收到 cors 错误? [复制]

Posted

技术标签:

【中文标题】使用resttemplate访问时,如何使端点仅接受springboot中启用@crossorigin的uri?为啥我没有收到 cors 错误? [复制]【英文标题】:How to make endpoints accept only @crossorigin enabled uris in springboot while accessing using resttemplate? Why am i not getting cors error? [duplicate]使用resttemplate访问时,如何使端点仅接受springboot中启用@crossorigin的uri?为什么我没有收到 cors 错误? [复制] 【发布时间】:2019-12-06 23:15:03 【问题描述】:

我有两个项目 A 和 B。它们都在不同的端口 A(8080) B(8091) 上运行。我在项目 A 中为端点“问候”启用了cors origin(http://localhost:8090)。然后尝试使用resttemplate 从项目 B 调用“问候”端点。由于项目 A 中的交叉源和调用项目 B 来自不同的端口,我预计会出现与 cors 相关的错误。

但我得到的是正确响应而不是错误。

我在 chrome 和 postman 中尝试过,但结果相同

//Project A
@RestController
public class GreetingController 
    @GetMapping("/greeting")
    @CrossOrigin(origins = "https://localhost:8090")
    public String greeting() 
        return "greetingsss";
    


//Project B
@RestController
public class GreetingController 
    @GetMapping("/greeting1")
    public String greeting() 
        final String uri = "http://localhost:8080/greeting";
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(uri, String.class);
        return result;
    

预期结果:加载失败,没有访问控制允许来源

实际结果:问候

【问题讨论】:

您的网络配置是什么样的? CORS 用于告诉浏览器它们可能允许来自其他来源的代码发出的 AJAX 请求。它不用于禁止请求,与来自 Java 应用程序的请求无关。例如,如果您只想处理某些请求而不处理其他请求,请使用过滤器并检查是否存在有效的 API 密钥。 【参考方案1】:

CORS 是用户代理(浏览器)强加的网络事物。因此,服务到服务的通信不会受到影响。如果您想实现服务到服务的通信,请使用 spring security,您可以在其中通过匹配某些模式来拦截 URL,并检查包括源 IP/域(hasIpAddress)在内的各种内容。在这里,您可以使用各种规则拒绝或允许访问。

或者,您可以编写一个安全过滤器来禁止/允许某些 IP/域。

【讨论】:

以上是关于使用resttemplate访问时,如何使端点仅接受springboot中启用@crossorigin的uri?为啥我没有收到 cors 错误? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

限制从 Azure 函数子网访问存储帐户

使rabbitmq群集可公开访问

resttemplate.exchange() 如何在不同的线程上执行?

如何使用RestTemplate访问restful服务

如何使用RestTemplate访问restful服务

如何像在 RestTemplate 中一样从 WebClient 获取访问令牌?