programing

스프링 부트에서 CORS를 활성화하는 방법 - 작동하지 않음

i4 2023. 7. 20. 21:42
반응형

스프링 부트에서 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;
    }
}

예상:

어떤 방법으로든 모든 오리진/도메인에서 컨트롤러에 액세스할 수 있어야 합니다.

실제:

오리진/도메인에서 컨트롤러에 액세스할 수 없습니다.그러면 Angular 프런트 엔드에 다음 오류가 발생합니다.

편집: 프런트 엔드의 내 오류

원산지 'http://localhost:4200'의 'localhost:8080/foo'에 있는 XMLHttpRequest에 대한 액세스가 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을 반환합니다.

교차 원점을 컨트롤러 레벨 자체에 배치

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

    @Autowired
    private IDAO conn;

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

이는 봄에 권장되는 직접 솔루션이며, 모든 응답에 대해 교차 원점을 허용하는 필터를 정의할 수도 있습니다.

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

주석에 대한 오리진을 추가해야 합니다.@CrossOrigin(origins = "*")

언급URL : https://stackoverflow.com/questions/56927217/how-to-enable-cors-in-spring-boot-not-working

반응형