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 Spring Boot 中的正则表达式
SpringBoot CORS 跨域 @CrossOrigin
springboot的@CrossOrigin注解解决细粒度的配置跨域