gpt4 book ai didi

java - 如何在 Spring Boot 中启用 CORS - 不工作

转载 作者:行者123 更新时间:2023-12-01 09:59:07 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





CORS Error: “requests are only supported for protocol schemes: http…” etc

(1 个回答)


2年前关闭。




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

我试过

  • @CrossOrigin注释
  • CORS with spring-boot and angularjs not working
  • 还有这个https://spring.io/guides/gs/rest-service-cors/

  • 我现在不知道如何解决这个问题,也不知道 CORS 不工作的问题是什么。

    我的代码

    Controller
    @RestController
    public class DbController {

    @Autowired
    private IDAO conn;

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


        @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;
    }
    }

    预计 :

    我希望我的 Controller 可以通过任何方法从任何来源/域访问。

    实际 :

    我的 Controller 无法从任何来源/域访问。它给我的 Angular 前端一个错误:

    编辑:我在前端的错误

    Access to XMLHttpRequest at 'localhost:8080/foo' from origin 'http://localhost:4200' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.



    第二次编辑 :

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

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

    我正在使用 HttpClient来自 import { HttpClient } from "@angular/common/http";
    我还通过将 URL 复制并粘贴到我的浏览器中来验证该 URL 在该服务方法中是否有效。它确实返回 JSON,它忽略了错误 URL 或拼写错误的可能性。

    最佳答案

    将您的交叉原点放在 Controller 级别本身

    @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() {}

    }
    另外你需要知道,你没有在你的代码快照中提到协议(protocol) 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 });
    }

    关于java - 如何在 Spring Boot 中启用 CORS - 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56927217/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com