SpringBoot中的@CrossOrigin [重复]

Posted

技术标签:

【中文标题】SpringBoot中的@CrossOrigin [重复]【英文标题】:@CrossOrigin in SpringBoot [duplicate] 【发布时间】:2020-04-15 05:16:39 【问题描述】:

我正在测试我对 CORS 工作原理的理解。我有 2 个应用程序在不同的端口上运行。我正在从应用 B 向应用 A 发送请求。应用 A 在端口 8080 上运行

  @Controller
    @EnableAutoConfiguration
    public class HelloController 

        @CrossOrigin(origins = "http://localhost:9000")
        @RequestMapping("/hello")
        @ResponseBody
        public String sayHello() 
            return "Hello World Developer!!!";
        
    

应用 B 在 8081 端口上运行

 @RequestMapping("/hello")
        @ResponseBody
        public String sayHello() throws IOException 


             String GET_URL = "http://localhost:8080/hello";
            URL obj = new URL(GET_URL);
            HttpURLConnection con = (HttpURLConnection) obj.openConnection();
            con.setRequestMethod("GET");
            int responseCode = con.getResponseCode();
            InputStream inputStream;
            if (200 <= responseCode && responseCode <= 299) 
                inputStream = con.getInputStream();
             else 
                inputStream = con.getErrorStream();
            

            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            inputStream));

            StringBuilder response = new StringBuilder();
            String currentLine;

            while ((currentLine = in.readLine()) != null)
                response.append(currentLine);

            return response.toString();


        

通过设置@CrossOrigin(origins = "http://localhost:9000"),请求不应该成功,因为允许应用程序A的唯一请求源来自端口9000。正确吗?但是在这里我得到了成功的响应代码 200 "Hello World Developer!!!"

【问题讨论】:

您需要在您的 http 请求中添加一些标头。这些标头是“Origin”、“Access-Control-Request-Method”和“Access-Control-Request-Headers”。如果请求中没有这些标头,CORS 将无法工作 【参考方案1】:

你能看看响应头“access-control-allow-origin”对应用A的请求有什么值吗?这不应该是“*”而是“http://localhost:9000”。

【讨论】:

这是我得到的响应头 ``` Content-Type →text/plain;charset=UTF-8 Content-Length →74 Date →Tue, 24 Dec 2019 05:10:01 GMT Keep-活着 →timeout=60 连接 →keep-alive ```【参考方案2】:

假设您的应用程序在不同的端口上运行。

我添加了以下代码来检查所有正在发送的标头。

for (Entry<String, List<String>> header : con.getHeaderFields().entrySet()) 
    System.out.println(header.getKey() + "=" + header.getValue());

我收到以下回复

Keep-Alive=[timeout=60]
Transfer-Encoding=[chunked]
null=[HTTP/1.1 200]
Connection=[keep-alive]
Date=[Tue, 24 Dec 2019 05:03:36 GMT]
Content-Type=[application/json]

请为您的情况尝试相同的方法。

因此 API 调用中没有可用的 access-control-allow-origin。 这可以被视为一个独立的调用,图中没有 CORS。

就像从浏览器或邮递员调用http://localhost:8080/hello一样。

如果您真的想测试 CORS,请尝试从 8081 App 中运行的某些 UI 调用相同的 ajax API。

请在浏览器检查中检查标题以查看正在传递的参数。您将看到 CORS 错误。

【讨论】:

你能否向我解释一下为什么 API 调用中没有 access-control-allow-origin 可用。这与 ajax API 调用有何不同?【参考方案3】:

跨源资源共享 (CORS) 是一种安全策略,它使用 HTTP 标头告诉浏览器让在一个源(域)运行的 Web 应用程序有权访问来自不同源的服务器的选定资源。

我认为下面的链接让您清楚。

http://zetcode.com/springboot/cors/

【讨论】:

这似乎无法回答我的问题。根据定义,localhost:8080 和 localhost:8081 是两个不同的来源。因此,由于端口不是 9000,因此不应提供从 localhost:8081 到 8080 的请求。我错过了什么吗? 我认为该链接会以某种方式帮助您了解该主题。该链接中没有针对您的问题的确切解决方案。如果没用,请见谅!

以上是关于SpringBoot中的@CrossOrigin [重复]的主要内容,如果未能解决你的问题,请参考以下文章

@CrossOrigin springboot里面使用跨域

@CrossOrigin Spring Boot 中的正则表达式

SpringBoot CORS 跨域 @CrossOrigin

springboot的@CrossOrigin注解解决细粒度的配置跨域

SpringBoot跨域(CORS)支持:注解@CrossOrigin

springboot之跨域访问cros,@CrossOrigin注解