다른 도메인에서 AJAX로 접근하면 Access-Control-Allow-Origin 에러가 발생한다.

 

해결 방법은 JSONP 요청.

 

JSONP로 ajax 호출을 하기 위해선 함수안에 json 문자열이 들어간 형식으로 서버에서 리턴 해줘야 한다.

ex) callback({"key":"value"});

 

1. 서버처리

 

 - callback 을 처리하기위해 JsonpAdvice 클래스 생성

   기존 json 처리와 동일하게 컨트롤러에서 처리가 가능하게 해준다. 

   spring boot 2.1 부터 삭제 되었다.

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
	public JsonpAdvice() {
		super("callback");
	}
}

- CORSFilter 생성

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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author ljo
 *
 */
public class CORSFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {

	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) servletRequest;
        ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", "*");
        ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","GET, OPTIONS, HEAD, PUT, POST");
        ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept");
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        if (request.getMethod().equals("OPTIONS")) {
            resp.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        chain.doFilter(request, servletResponse);
	}

	@Override
	public void destroy() {

	}

}

- 필터 등록

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import com.solution.framework.filter.CORSFilter;

/**
 *
 * @author ljo
 *
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
	@Bean
	public FilterRegistrationBean getFilterRegistrationBean(){
		FilterRegistrationBean registrationBean = new FilterRegistrationBean(new CORSFilter());
		registrationBean.addUrlPatterns("/test");
		registrationBean.addUrlPatterns("/test/*");
		return registrationBean;
	}
}

2. 클라이언트 요청

$.ajax({
	type : "post",
	url : "http://domain.com/test",
	contentType : "application/json",
	dataType : "json",
	async : true,
	success : function(data, textStatus, XMLHttpRequest) {
		
	},
	error : function(data, textStatus, errorThrown){

	}
});

jsonpCallback 은 굳이 붙여줄 필요는 없다.

 

광고 : https://play.google.com/store/apps/details?id=com.ljo.blocktube

 

이게불낙이야! - 광고차단 - Google Play 앱

동영상 광고 및 배너 광고를 제거합니다.

play.google.com

 

'개발 > java&kotlin' 카테고리의 다른 글

Spring boot - logback 로그처리  (0) 2020.03.27
java 로 캡챠 구현  (0) 2020.03.26
WebBindingInitializer 활용  (0) 2018.07.12
POI 엑셀 다운로드  (0) 2018.07.11
spring boot 스케줄러 설정  (0) 2018.07.11