【问题标题】:How to enable CORS in Spring Boot - Not working [duplicate]如何在 Spring Boot 中启用 CORS - 不工作 [重复]
【发布时间】:2019-11-17 12:20:15
【问题描述】:

我正在尝试在我的 Spring Boot 应用中启用 CORS,但它根本不起作用。


我试过了

我目前不知道如何解决此问题,也不知道 CORS 无法正常工作的问题是什么。


我的代码

控制器

@RestController
public class DbController {

    @Autowired
    private IDAO conn;

    @CrossOrigin
    @GetMapping("/foo")
    public List<Foo> getFoo() {
        return conn.getFooFromDao();
    }
}

DAO

    @Repository
    public class DaoImpl implements IDAO {

    @Autowired
    private JdbcTemplate temp;

    public List<Foo> getFooFromDao() {

        List<Foo> data = new ArrayList<>();

        String sql = "SELECT fooName FROM BigFoo ORDER BY fooName ASC;";

        data.addAll(temp.query(sql, new BeanPropertyRowMapper(BigFoo.class)));
        return data;
    }
}

预期

我希望通过 any 方法从 any 源/域访问我的控制器。

实际

我的控制器不能任何源/域访问。它给我的 Angular 前端一个错误:

编辑:我在前端的错误

在 'localhost:8080/foo' 从源访问 XMLHttpRequest 'http://localhost:4200' 已被 CORS 策略阻止:跨源 请求仅支持协议方案:http、data、chrome、 chrome 扩展,https。

第二次编辑

这是我在 Angular(前端)中的代码:

服务

getFoo() {
    return this.http.get("localhost:8080/foo");
  }

我正在使用来自import { HttpClient } from "@angular/common/http";HttpClient

我还通过将 URL 复制并粘贴到我的浏览器中来验证该 URL 在该服务方法中是否有效。它确实返回了 JSON,它排除了错误 URL 或拼写错误的可能性。

【问题讨论】:

  • 对不起,我不明白你在说什么。什么是 Spring In Action 5?
  • 你的spring tomcat控制台有没有收到任何信号,我的意思是请求到达了吗?并告诉我你是如何使用这项服务的?到现在为止,你做得对。
  • 不,我的 spring 控制台中没有任何响应。它只是在我的浏览器中给了我错误,而没有响应它在我的 IntelliJ 控制台中击中它。另外,“使用服务”是什么意思?
  • 错字;你需要做this.http.get("http://localhost:8080/foo") 而不是this.http.get("localhost:8080/foo")。也就是说,您必须包含http:// 部分。
  • 您需要在 Angular 应用程序的 url 前面输入协议名称“http://”:例如this.http.get("http://localhost:8080/foo")

标签: java spring spring-boot cors


【解决方案1】:

将您的交叉原点放在控制器级别本身

@RestController
@CrossOrigin(origins = "*")
public class DbController {

    @Autowired
    private IDAO conn;

    @GetMapping("/foo")
    public List<Foo> getFoo() {
        return conn.getFooFromDao();
    }
}

这是 spring 推荐的直接解决方案,您还可以定义一个过滤器,允许所有响应跨源

@Component
public class SimpleCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

public SimpleCORSFilter() {
    log.info("SimpleCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

    chain.doFilter(req, res);
}

  @Override
  public void init(FilterConfig filterConfig) {}

  @Override
  public void destroy() {}

}

另外你需要知道,你没有在你的代码快照中提到协议http或https,并且你还没有发送GET请求,当你开始订阅它时会发送请求这样

getFoo() {
    return this.http.get("http://localhost:8080/foo");
}

getFoo().subscribe(resp -> { // your logic });

// or directly inside getFoo() like this 
getFoo() {
    return this.http.get("http://localhost:8080/foo")
    .subscribe(resp -> { // your logic });
}

【讨论】:

  • 这不起作用。
  • 你得到了什么,前端和堆栈跟踪中的错误消息?
  • 我会将其发布到我的问题中。
  • 我也这样做了,还是没有解决问题。
  • 我也更新了答案,我相信问题不在于 spring 本身,检查 API URL 是否正确写入 font-end ,或者您也可以从 UI 代码附加快照
【解决方案2】:

您需要为注解@CrossOrigin(origins = "*")添加来源

【讨论】:

  • 这不适用于我的控制器方法。
  • “我的控制器无法从任何来源/域访问”,那么您可以从原始域访问,例如 localhost 8080 默认的 spring 吗?在跨域访问之前,请确保您的 REST API 可用。
  • 是的,当我在浏览器中转到 localhost:8080/foo 时,它正在工作。有趣的错误不是吗?
  • 从你的代码中,你没有设置通配符“*”,所以你确保你添加了origins = "*",对吧?
  • @Compilerv2 我面临类似的问题local:8080 工作但localhost:3005 在添加跨源之后也失败了,为什么???
猜你喜欢
  • 2020-05-29
  • 2021-04-03
  • 2023-04-05
  • 2020-09-13
  • 2019-01-14
  • 2019-06-26
  • 1970-01-01
  • 2018-08-02
  • 2019-10-10
相关资源
最近更新 更多