복붙노트

[SPRING] 교차 원산지 요청 차단 된 Spring REST 서비스 + AJAX

SPRING

교차 원산지 요청 차단 된 Spring REST 서비스 + AJAX

봄 REST 서비스를 호출 할 수 없습니다.

나의 봄 서비스

@RequestMapping(value = "/MAS/authenticate", method = RequestMethod.POST)
public ResponseEntity<Map<String, String>> authenticate(@RequestBody Subject subject) {
    Map<String, String> result = new HashMap<String, String>();
    result.put("result_detail", "Invalid Password");
    result.put("result", "failure");
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(MediaType.APPLICATION_JSON);
    responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
    return new ResponseEntity<Map<String, String>>(result, responseHeaders, HttpStatus.OK);
}

내 AJAX 코드

$.ajax(
{
  crossDomain: true,
  type: "POST",
  contentType: "application/json; charset=utf-8",
  async: false,
  url: "http://localhost:8080/SpringMVC/rest/MAS/authenticate",
  headers: {"Access-Control-Allow-Origin" : "*"},
  data:{},
  dataType: "json", //also tried "jsonp"
  success: function(data, status, jqXHR)
  {
    alert('success');
  },
  error: function(jqXHR, status)
  {
    alert('error');
  }
});

다음과 같은 오류가 발생합니다. (

나는 또한 데이터 타입을 시도했다 : "jsonp". 그것의 다른 URL을 만들고 내 서비스 URL을 누른 다음 404 오류가있어 URL에 내 몸 개체를 추가합니다.

내 브라우저 : firefox 36.0.4

어떻게하면이 오류를 제거 할 수 있습니까?

해결법

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

    1.내 AJAX 호출과 서비스는 괜찮습니다. 인터넷에서 많은 검색을 한 후에 나는 서버 쪽 문제가 클라이언트 쪽이 아니라는 사실을 발견했습니다.

    내 AJAX 호출과 서비스는 괜찮습니다. 인터넷에서 많은 검색을 한 후에 나는 서버 쪽 문제가 클라이언트 쪽이 아니라는 사실을 발견했습니다.

    서버 측에서는 CORS 요청을 허용하는 필터를 구현해야한다.

    필터는 다음과 같이 보입니다.

    import java.io.IOException;
    
    import javax.servlet.FilterChain;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;
    import org.springframework.web.filter.OncePerRequestFilter;
    
    public class CORSFilter extends OncePerRequestFilter {
        private static final Log LOG = LogFactory.getLog(CORSFilter.class);
    
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    
            response.addHeader("Access-Control-Allow-Origin", "*");
            if (request.getHeader("Access-Control-Request-Method") != null && "OPTIONS".equals(request.getMethod())) {
                LOG.trace("Sending Header....");
                // CORS "pre-flight" request
                response.addHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
                // response.addHeader("Access-Control-Allow-Headers", "Authorization");
                response.addHeader("Access-Control-Allow-Headers", "Content-Type");
                response.addHeader("Access-Control-Max-Age", "1");
            }
            filterChain.doFilter(request, response);
        }
    
    }
    

    web.xml에서 다음과 같이 서비스 요청에이 필터를 적용합니다.

        <filter>
            <filter-name>cors</filter-name>
            <filter-class>com.test.common.controller.CORSFilter</filter-class> <!-- your package name and filter class -->
        </filter>
        <filter-mapping>
            <filter-name>cors</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping> 
    

    이것은이 문제를 겪은 다른 사람을 도울 수 있습니다. :)

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

    2.기본적으로 허용되는 유일한 방법은 GET이며 서버 측에서 POST를 허용하지 않습니다.

    기본적으로 허용되는 유일한 방법은 GET이며 서버 측에서 POST를 허용하지 않습니다.

    Access-Control-Allow-Origin: *
    

    이 헤더는 CORS 만 활성화하지만 다음을 추가해야합니다.

    Access-Control-Allow-Methods: POST, GET
    

    Mozilla 프로젝트의 HTTP 액세스 제어 (CORS)에 대한 자세한 방법

    따라서 코드는 다음과 같아야합니다.

    responseHeaders.add("Access-Control-Allow-Methods", "POST, GET"); // also added header to allow POST, GET method to be available
    responseHeaders.add("Access-Control-Allow-Origin", "*"); // also added header to allow cross domain request for any domain
    

    최신 정보:

    나는 그 기사를 다시 읽고 몇 가지 세부 사항을 발견했다.

    굵은 글씨로 읽을 수 있으면 데이터 용으로 다른 Content-Type (현재 contentType : "application / json; charset = utf-8")을 설정하거나 나중에 설명 할 프리 플라이트 기술을 사용해야합니다.

    따라서 contentType을 변경하거나이 헤더를 요청에 적용 해보십시오.

    Access-Control-Request-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE
    

    그리고 당신의 응답에이 헤더 :

    Access-Control-Allow-Methods: POST, GET, OPTIONS
    Access-Control-Allow-Headers: X-HEADER_NAME_OF_YOUR_CHOOSE
    

    그 후에는 방법을 호출 할 수 있습니다.

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

    3.다음은 크로스 플랫폼 스프링 부트 웹 서비스 호출에 대한 솔루션입니다.

    다음은 크로스 플랫폼 스프링 부트 웹 서비스 호출에 대한 솔루션입니다.

    응용 프로그램 URL : http : // localhost : 8080

    웹 서비스 URL : http : // localhost : 9090

    스프링 컨트롤러에서 다음 주석을 사용하십시오.

    @CrossOrigin(origins = "http://localhost:8080")
    @RequestMapping(value = "/uri", method = RequestMethod.GET)
    public SomeObject someMethod(){
    // your logic will come here
    }
    
  4. from https://stackoverflow.com/questions/29389031/cross-origin-request-blocked-spring-rest-service-ajax by cc-by-sa and MIT license