복붙노트

[SPRING] Angular2 / Spring Boot는 PUT에 교차점을 허용합니다.

SPRING

Angular2 / Spring Boot는 PUT에 교차점을 허용합니다.

내 웹 응용 프로그램에 약간의 문제가 있습니다. 각도 2 앱이 스프링 부팅 API에 연결되었습니다.

angular2 앱에서 내 요청에 액세스 할 수 없습니다. 이 오류가 발생합니다.

Failed to load http://localhost:8080/deliveryMan/: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.

자바 코드 :

@RestController
@RequestMapping(value = "/deliveryMan")
@CrossOrigin
public class DeliveryManController {

    @Autowired
    DeliveryManService deliveryManService;

    @RequestMapping(value = "/getAllDeliveryMan", method = RequestMethod.GET)
    public Iterable<DeliveryMan> getAllDeliveryMan(){
        return deliveryManService.findAll();
    }

    @RequestMapping(method = RequestMethod.PUT, consumes = "application/json")
    public DeliveryMan addDeliveryMan(@RequestBody DeliveryMan deliveryMan) throws InvalidObjectException {
        deliveryManService.save(deliveryMan);
        return deliveryMan;
    }

@SpringBootApplication
@EnableAutoConfiguration
@ComponentScan
public class MyApp{

    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}

angular2 코드 :

private apiUrl = 'http://localhost:8080/deliveryMan/';

getAll(): Promise<DeliveryMan[]> {
  const url = this.apiUrl + 'getAllDeliveryMan';
  return this.http.get(url)
    .toPromise()
    .then(response => response.json().data as DeliveryMan[])
    .catch(this.handleError);
}

saveDeliveryMan(deliveryMan: DeliveryMan): Promise<DeliveryMan> {
  const url = this.apiUrl;
  return this.http.put(url, JSON.stringify(deliveryMan), this.headers)
    .toPromise()
    .then(() => deliveryMan)
    .catch(this.handleError);
}

문제를 해결하기 위해 @CrossOrigin을 컨트롤러 클래스에 추가했습니다. 그것은 getAll 메소드에 대한 문제점을 해결하지만 추가 메소드에 대해서는 문제점을 해결하지 않습니다.

이 오류가 발생하지 않고 PUT 메서드를 사용할 수 있도록 해결하는 방법?

해결법

  1. ==============================

    1.프로젝트에 CORSFilter.java 파일을 만듭니다.

    프로젝트에 CORSFilter.java 파일을 만듭니다.

    @Component
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class CORSFilter implements Filter {
    
        /**
         * CORS filter for http-request and response
         */
        public CORSFilter() {
        }
    
        /**
         * Do Filter on every http-request.
         */
        @Override
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            HttpServletRequest request = (HttpServletRequest) req;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "access_token, authorization, content-type");
    
            if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
                response.setStatus(HttpServletResponse.SC_OK);
            } else {
                chain.doFilter(req, res);
            }
        }
    
        /**
         * Destroy method
         */
        @Override
        public void destroy() {
        }
    
        /**
         * Initialize CORS filter 
         */
        @Override
        public void init(FilterConfig arg0) throws ServletException {
        }
    }
    

    이 게시물을 참조 할 수 있습니다. Angular 2 Spring Boot CORS 문제

  2. ==============================

    2.컨트롤러에 @CrossOrigin (origins = "http : // localhost : 4200") 주석을 추가하십시오.

    컨트롤러에 @CrossOrigin (origins = "http : // localhost : 4200") 주석을 추가하십시오.

    @CrossOrigin(origins = "http://localhost:4200")
    @RequestMapping(method = RequestMethod.PUT, consumes = "application/json")
        public DeliveryMan addDeliveryMan(@RequestBody DeliveryMan deliveryMan) throws InvalidObjectException {
            deliveryManService.save(deliveryMan);
            return deliveryMan;
        }
    
  3. ==============================

    3.다음을 사용할 수 있습니다 : (모든 CRUD 작업에서 작동해야합니다)

    다음을 사용할 수 있습니다 : (모든 CRUD 작업에서 작동해야합니다)

    @CrossOrigin(origins = "*")
    
  4. from https://stackoverflow.com/questions/46788969/angular2-spring-boot-allow-cross-origin-on-put by cc-by-sa and MIT license