如何在Spring Boot中启用CORS-无法正常运行

时间:2019-07-08 00:56:11

标签: java spring spring-boot cors

我正在尝试在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-extension,https。

第二次修改

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

服务

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

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

我还通过将URL复制并粘贴到我的浏览器中来验证URL是否可以使用该服务方法。确实确实会返回JSON,从而忽略了错误的URL或错字的可能性。

2 个答案:

答案 0 :(得分:0)

您需要为注释@CrossOrigin(origins = "*")添加原点

答案 1 :(得分:0)

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

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

}