source

Rest Controller에서 메서드 Cors 문제 삭제

manycodes 2023. 7. 30. 17:58
반응형

Rest Controller에서 메서드 Cors 문제 삭제

프로젝트에 다른 서버의 클라이언트 응용프로그램에서 호출하는 일부 Rest 끝점이 있습니다.나는 성공적으로 코르스를 사용하지 못하게 했습니다.@CrossOrigin주석, 그리고 Chrome에서 다음 오류를 발생시키는 Delete 메서드를 제외한 모든 메서드가 잘 작동합니다.

XMLHttpRequest cannot load http://localhost:8856/robotpart/1291542214/compatibilities. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://127.0.0.1:8888' is therefore not allowed access. The response had HTTP status code 403.

컨트롤러는 다음과 같습니다.

@CrossOrigin(origins = "*")
@ExposesResourceFor(RobotPart.class)
public class RobotPartController {

      //All endpoints are working except the Delete Mapping

    @GetMapping("/robotpart")
    public ResponseEntity<List<RobotPartResource>> listAllParts() {
        //..
    }

    @GetMapping("/robotpart/{id}")
    public ResponseEntity<RobotPartResource> getById(@PathVariable Integer id) {
        //..
    }


    @GetMapping("/robotpart/{id}/compatibilities")
    public ResponseEntity<Collection<RobotPartResource>> getRobotCompatibilities(@PathVariable Integer id,
          //..
    }


    @PostMapping("/robotpart")
    public ResponseEntity<RobotPartResource> getById(@RequestBody @Valid RobotPart newRobot) {
        //..

    @PutMapping("/robotpart/{id}")
    public ResponseEntity<RobotPartResource> modify(@PathVariable Integer id, @Valid @RequestBody RobotPart newRobot) {

         //...
    }

    @DeleteMapping("/robotpart/{id}")
    public ResponseEntity<RobotPart> deleteById(@PathVariable Integer id) {

        //...
    }

    }

어떻게든?

해결책을 찾았습니다, http 요청을 분석한 후, Access-Control-Allow-Methods 헤더에 DELETE 메서드가 없는 것을 발견하여, 삭제하여 추가했습니다.@CrossOrigin주석 및 이 빈을 구성에 추가합니다.

        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/robotpart/**").allowedOrigins("*").allowedMethods("GET", "POST","PUT", "DELETE");


                }
            };
        }

위의 답변에 덧붙여, CORS를 비활성화하는 것이 DELETE에 적용되지 않는 이유(그러나 GET 및 POST에 적용됨)는 이것이 여기에 명시된 WebMvcConfigurer의 기본 동작이기 때문입니다(노란색으로 강조 표시됨).

enter image description here

이것은 제 CORS 구성입니다. 누군가에게 도움이 될 수 있습니다.

@Bean
CorsConfigurationSource corsConfigurationSource() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

    CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
    corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
    corsConfiguration.addAllowedMethod(HttpMethod.PATCH);
    source.registerCorsConfiguration("/**", corsConfiguration);

    return source;
}

이전 답변 중 일부는 매우 유용했지만(스프링 부트 2.7.4) 저의 경우에는 다음과 같이 Cors를 구성해야 했습니다.

@Configuration
@EnableWebMvc
public class CorsConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedMethods("GET", "POST","PUT", "DELETE");
    }
}

언급URL : https://stackoverflow.com/questions/43166984/delete-method-cors-issue-in-rest-controller

반응형