다른 도메인에서 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
'개발 > 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 |