** 참고문서
CORS 크로스 도메인 이슈 (No ‘Access-Control-Allow-Origin’ header is present on the requested resource)
위 문서는 Spring 개발시 여러 도메인을 가질 경우, Ajax에서 발생하는 CORS 문제 해결에 대해 설명합니다.
크로스도메인문제 발생시 오류메시지
XMLHttpRequest cannot load http://www.ABC.co.kr. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://S1.ABC.co.kr' is therefore not allowed access.
이에 대한 한글 안내는 이렇게 써 있습니다.
교차 원본 요청 차단: 동일 출처 정책으로 인해 http://xxx.co.kr 에 있는 원격 자원을 읽을 수 없습니다. 자원을 같은 도메인으로 이동시키거나 CORS를 활성화하여 해결할 수 있습니다.
이에 대한 해결책
설명이 이것저것 잡다하게 많은데요, 실제 이를 해결하는 방법은 어렵지 않습니다.
크로스 도메인 요청을 허용할 웹 서버에서 크로스 도메인 이슈를 문제 삼지 않을 도메인을 지정해주면 됩니다.들어오는 모든 요청에 대해 처리해주기 위해 Filter 를 하나 만들어야 될 것 같습니다.
필터(Filter) 이름은 SimpleCORSFilter 로 하기로 하고 SimpleCORSFilter class 를 Filter interface를 구현하여, 생성하도록 합니다.
그리고 이 필터를 웹서비스의 web.xml 에 등록하여 줍니다.
필터 추가를 위해서는 web.xml 수정과 SimpleCORSFilter.java 작성이 필요합니다.
** web.xml 수정: 필터 등록
<!-- 필터 이름과 클래스 등록 --> <filter> <filter-name>cors</filter-name> <filter-class>com.company.project.util.domain.SimpleCORSFilter</filter-class> </filter> <!-- 필터가 적용될 대상: url 패턴 --> <filter-mapping> <filter-name>cors</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
** SimpleCORSFilter.java 추가 :
필터를 통해 내보내지는 모든 응답(response) HTTP Header에 Access-Control-* 설정을 넣는다. 추가되는 항목은.. (filter는 이런 용도에 쓰인다)
- 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”);
- response.setHeader(“Access-Control-Allow-Origin”, “*”);
package com.company.project.util.domain; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; @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-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); // 허용대상: 전부 허용하던지 response.setHeader("Access-Control-Allow-Origin", "*"); // 허용대상: 아래 3개의 도메인만 허용하던지 // response.addHeader("Access-Control-Allow-Origin", "http://S1.ABC.co.kr"); // response.addHeader("Access-Control-Allow-Origin", "http://S2.ABC.co.kr"); // response.addHeader("Access-Control-Allow-Origin", "http://S3.ABC.co.kr"); chain.doFilter(req, res); } public void init(FilterConfig filterConfig) {} public void destroy() {} }
이런 방법에 대한 글을 전에도 읽은 것 같은데, 이제서야 이해가 되네요. 역시 이해될 때까지 반복하는게 중요!! 그리고 출처 글쓴이에게 감사드립니다.
님 허용대상 추가하는거 하나만 되는데 두개는 못하나여???
좋아요좋아요