SpringBoot中的@CrossOrigin

时间:2019-12-24 03:10:31

标签: java spring spring-boot cors network-programming

我正在测试对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 !!!”。

3 个答案:

答案 0 :(得分:0)

请问响应头“ access-control-allow-origin”对应用A的请求具有什么值,它不应为“ *”,而应为“ http://localhost:9000”。

答案 1 :(得分:0)

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

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

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。

就像从浏览器或POSTMAN调用http://localhost:8080/hello

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

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

答案 2 :(得分:-1)

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

我认为下面的链接可以使您更加清楚。

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