春季启动中的 CORS 不起作用 - 获得空响应



我正在使用Spring Boot(Tomcat + Java(作为我的后端应用程序,React用于我的前端。 我正在尝试从"http://localhost:3000"访问"http://localhost:8080/vr-backend-0.0.1-SNAPSHOT/stockdata/NIFTY19DECFUT?from=2019-12-03&to=2019-12-03"。

我在控制器级别和端点级别都添加了@CrossOrigin(origins = "*"(。我得到空的结果。 我在控制器级别和端点级别都添加了@CrossOrigin。我得到空的结果。

如果我删除@CrossOrigin注释,则会出现Cors错误。这意味着注释是必要的。错误是"CORS 策略已阻止从源 'http://localhost:3000' 获取 'http://localhost:8080/vr-backend-0.0.1-SNAPSHOT/stockdata/NIFTY19DECFUT?from=2019-12-03&to=2019-12-03' 的访问:请求的资源上不存在'访问控制-允许源'标头。如果不透明的响应满足您的需求,请将请求的模式设置为"no-cors",以便在禁用 CORS 的情况下获取资源。

如果我直接在浏览器中复制粘贴链接,它正在工作并返回 JSON。 如果我调用"https://cdn.rawgit.com/rrag/react-stockcharts/master/docs/data/MSFT.tsv",它也返回结果。

为了避免拼写错误,我做了控制台.log我正在从控制台.log粘贴这些内容。

我正在使用 fetch 进行"获取"。

[编辑1] 我正在查看雄猫日志,很快就会更新。

[编辑2] TL;博士 这不是 CORS 问题。

完整描述: 1. "http://localhost:8080/vr-backend-0.0.1-SNAPSHOT/stockdata/NIFTY19DECFUT?from=2019-12-03&to=2019-12-03"的响应为 200。

  1. 我登录了 Spring 启动应用程序并查看了 tomcat 日志。它到达控制器方法,我从数据库中获得正确的结果。当我发回响应时,我在浏览器中得到空结果。如前所述,如果我直接点击网址,我会得到正确的结果。

  2. 它不是预检选项请求。

  3. 因此可以得出结论,这不是CORS问题。 @CrossOrigin注释工作

发布问题后,我查看了日志。所以这个问题可以结束,因为它是不正确的。如果我无法解决空响应问题,我将发布一个单独的问题,因为此问题标题具有误导性。

谢谢大家的回复。

我以这种方式使用它来允许来自所有来源的请求。它为我的所有项目工作。

package com.example.demo.filters;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
@Component
public class CORSFilter extends OncePerRequestFilter {
@Override
public void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
final FilterChain filterChain) throws ServletException, IOException {
response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,
"Origin, Content-Type, Accept, Authorization, Accept-Language, connection, Cache-Control, Access-Control-Request-Method, Access-Control-Request-Headers");
response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD");
response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS,
"Access-Control-Allow-Origin, Access-Control-Allow-Credentials");
response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, request.getHeader(HttpHeaders.ORIGIN));
filterChain.doFilter(request, response);
}
}

我只在应用程序级别配置过 CORS, 但是@CrossOrigin注释的文档说它默认允许所有源,所以你可能想尝试@CrossOrigin()而不是@CrossOrigin(origins = "*")

该文档还说它支持"@RequestMapping注释中指定的HTTP方法",因此除了GET或POST之外,您可能还需要添加OPTIONS方法,或者您当前使用的任何方法(CORS需要支持OPTIONS方法(。

您可以在 api 端点中使用@CrossOrigin而不提及来源。

指定原点也可能对多层环境造成影响。

请记住Access-Control-Allow-Origin: *仅在没有任何身份验证方法(没有凭据的请求(时使用。看:

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin

如果不透明响应满足您的需求,请将请求的模式设置为"no-cors",以便在禁用 CORS 的情况下获取资源

不要在抓取调用中使用'no-cors',因为您会收到不透明的响应。指定'cors'或不指定任何内容。

const response = await fetch("http://localhost:8080", {
method: 'GET',
// mode: 'cors',
headers: {
'Accept': 'application/json'
}
});

实际上,当您得到200 OKopaque响应时,服务器不再是问题。响应是 200,但数据是不透明的,因为前端可能设置了"no-cors"或类似设置。看:

https://developers.google.com/web/updates/2015/03/introduction-to-fetch

关于后端,在 Spring Boot (w/Kotlin( 中,我正在使用它发送Access-Control-Allow-Origin: *标头,基于spring-boot-starter-security库。

package demo.config
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
@Configuration
class GeneralApiSecurityConfig() : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http.cors()
}
}

只是http.cors()

哦,这可能是一个微不足道的建议,但是如果您弄乱了配置,请每次都重新启动服务器,否则,您很可能正在刷新前端客户端,但服务器卡住了以前的尝试。

最新更新