我正在测试对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 !!!”。
答案 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>
我认为下面的链接可以使您更加清楚。