복붙노트

[SPRING] Spring MVC + Zepto POST의 'Access-Control-Allow-Origin'오류

SPRING

Spring MVC + Zepto POST의 'Access-Control-Allow-Origin'오류

스프링 MVC 컨트롤러에 JSON 객체를 POST하려고하는데 Access-Control-Allow-Origin 오류 만 수신합니다.

내 컨트롤러 :

@RequestMapping(value= "/add", method = RequestMethod.POST, headers = {"content-type=application/json"})
public @ResponseBody Reponse addUser(Model model, @RequestBody @Valid @ModelAttribute("user") User user, BindingResult result) {
    if (result.hasErrors()) {
        Reponse error = new Reponse();
        // etc......
        return error;
    } else {
        return service.addUser(user);
    }
}

내 Zepto POST :

this.addUser = function (valeur, callback) {
    $.ajax({
        type: 'POST',
        url: 'http://127.0.0.1:8080/AgenceVoyage/user/add',
        data: JSON.stringify({"mail" : "toto@toto.fr" , "password" : "titi"}),
        dataType: "json",
        contentType: "application/json",

        success: function(data) {
            if(data.reponse == "OK") {
                window.location = "main.html";
            } else {
                alert("PROBLEM");
            }
        },

        error: function(xhr, type) {
            alert("ERROR");
        }
    });
};

@RequestMapping에 헤더가없는 POST 요청에서 stringify를 시도했습니다.

내 결과 :

해결법

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

    1.해결책을 찾았습니다.

    해결책을 찾았습니다.

    먼저 헤더 응답을 설정할 새 필터를 만듭니다.

        @Component
    public class SimpleCORSFilter implements Filter {
    
        public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
            chain.doFilter(req, res);
        }
    
        public void init(FilterConfig filterConfig) {}
    
        public void destroy() {}
    
    }
    

    그 후에 web.xml에 다음 행을 추가하십시오.

     <filter>
      <filter-name>cors</filter-name>
      <filter-class>MY.PACKAGE.SimpleCORSFilter</filter-class>
     </filter>
    
     <filter-mapping>
      <filter-name>cors</filter-name>
      <url-pattern>/*</url-pattern>
     </filter-mapping>
    

    그리고 그 모든 것!

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

    2.페이지가 http : // localhost : 9000의 서버에서로드되고 있으며이 페이지가 ajax 요청을 통해 다른 도메인 http://127.0.0.1:8080/AgenceVoyage/user/add에 액세스하려고하기 때문입니다.

    페이지가 http : // localhost : 9000의 서버에서로드되고 있으며이 페이지가 ajax 요청을 통해 다른 도메인 http://127.0.0.1:8080/AgenceVoyage/user/add에 액세스하려고하기 때문입니다.

    다른 포트 번호는 두 개의 다른 도메인에 해당하는 두 개의 URL을 만들어 주며, 두 호스트가 모두 localhost URL이기도합니다.

    두 개의 도메인이 서로 다른 도메인으로 간주되기 때문에 브라우저의 ajax Same Origin Policy가 실행되어 보안상의 이유로 요청이 실행되지 않습니다. 타사 도메인에 대한 ajax 요청은 허용되지 않습니다.

    ajax 동일 원산지 정책, 특히 원점 결정 정책 섹션에서 포트 번호가 원점의 일부임을 언급 한 자세한 내용은 여기를 참조하십시오.

  3. ==============================

    3.애플리케이션이 프로그래밍 방식으로 구성되는 경우 'xml'대신 WebApplicationInitializer 구현에서 다음 코드가 필요합니다.

    애플리케이션이 프로그래밍 방식으로 구성되는 경우 'xml'대신 WebApplicationInitializer 구현에서 다음 코드가 필요합니다.

    public class WebAppInitializer implements WebApplicationInitializer {
    
      @Override
      public void onStartup(ServletContext servletContext) {
          ... // your context configuration like in Spring.io tutorial
    
         // Register filter to allow cross-domain requests
         registerServletFilter(servletContext, new SimpleCORSFilter());
      }
    
      ...
    
      protected FilterRegistration.Dynamic registerServletFilter(ServletContext servletContext, Filter filter) {
        String filterName = Conventions.getVariableName(filter);
        FilterRegistration.Dynamic registration = servletContext.addFilter(filterName, filter);
        registration.setAsyncSupported(true);
        registration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), false, "/*");
        return registration;
      }
    }
    

    필터가

    @Component
    public class SimpleCORSFilter implements Filter {
    
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
       response.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept");
        chain.doFilter(req, res);
      }
    
      public void init(FilterConfig filterConfig) {}
    
      public void destroy() {}
    
    }
    
  4. ==============================

    4.이 주석을 @CrossOrigin을 컨트롤러 클래스에 삽입하십시오.

    이 주석을 @CrossOrigin을 컨트롤러 클래스에 삽입하십시오.

    @CrossOrigin(origin = "http://domain2.com", maxAge = 3600)
    @RestController
    @RequestMapping("/account")
    public class UserController {
    
    }
    

    글꼴 : https://dzone.com/articles/cors-support-spring-framework

  5. from https://stackoverflow.com/questions/21864147/access-control-allow-origin-error-in-spring-mvc-zepto-post by cc-by-sa and MIT license