cors 에러 해결 기록
1. 나의 상황
http로 된 프로젝트에서 https로 만들어진 POST 형식으로 웹서비스를 호출해서 데이터를 리턴 받아와야했다.
//운영
var webServiceRootURL = "https://웹서비스링크";
var jsonData = {
"Param1":"데이터들"
}
$.ajax({
url : webServiceRootURL,
dataType : "text",
type : "POST",
contentType : "application/x-www-form-urlencoded; charset=UTF-8",
dataType: 'json',
cache : false,
data : JSON.stringify(jsonData),
success:function(html){
alert('부르기 완료');
},
error:function(xhr, status, error){
console.error(xhr.status, xhr.responseText, error);
return;
}
});
이렇게 날리면 아래와 같은 에러가 발생한다.
XHR failed loading: POST
2. 오류 원인
내가 만드는 주소는
http:// 0.0.0.0 / test.do
내가 호출하려는 웹 서비스는
https://webService/web.svc/T1
주소의 형식이 다르다.
http / https 를 비롯해서 주소 전체가.. 그러면 크로스 도메인 정책에 위반이 된다고한다.
자세한 내용은 아래 링크에서 확인하면 된다.
https://developer.mozilla.org/ko/docs/Web/HTTP/CORS
교차 출처 리소스 공유 (CORS) - HTTP | MDN
교차 출처 리소스 공유(Cross-Origin Resource Sharing, CORS)는 추가 HTTP 헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을 부여하도록 브라
developer.mozilla.org
3. 해결방법
1) dataType : 'jsonp' - 실패
이건 POST는 안되고 GET만 가능하다고 한다. 장렬히 실패
$.ajax({
url : webServiceRootURL,
dataType : "text",
type : "POST",
contentType : "application/x-www-form-urlencoded; charset=UTF-8",
dataType: 'jsonp',
cache : false,
data : JSON.stringify(jsonData),
success:function(html){
alert('부르기 완료');
},
error:function(xhr, status, error){
console.error(xhr.status, xhr.responseText, error);
return;
}
});
2) 컨트롤러로 우회하여 접속 (내가 선택한 방법)
@RequestMapping(value = "/test.do")
public @ResponseBody List<Map<String, Object>> test(HttpServletRequest request, @RequestBody String param)throws Exception {
System.out.println("=========test============");
String parameters = param.replace("}", ","+paramData+"}");
System.out.println(parameters);
String urlString1 = "서비스 경로 " ;
List<Map<String, Object>> resultList = new ArrayList<>();
Object responseObj = null;
JSONParser p = new JSONParser();
String jsonStr =parameters.toString();
try {
URL url = new URL(urlString1);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Accept-Charset", "UTF-8");
OutputStream os = conn.getOutputStream();
os.write(jsonStr.getBytes("UTF-8"));
os.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String inputLine;
StringBuilder response = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
JSONParser parser = new JSONParser();
JSONArray jsonArray = (JSONArray) parser.parse(response.toString());
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
Map<String, Object> map = new HashMap<>();
map.put("response", jsonObject); // "response"라는 키로 추가
resultList.add(map);
}
System.out.println("resultList: " + resultList);
in.close();
conn.disconnect();;
} catch (Exception e) {
System.out.println("오류 " + e.getMessage());
e.printStackTrace();;
}
return resultList;
}
3) cors가 뜨지 않도록 설정
내가 가지고 있는 프로젝트는 cors 설정을 해 놨는데, 연결하려는 웹서비스에는 cors 설정이 되어 있지 않다고 한다.
즉, 나만 설정하는게아니라 내가 호출하는 쪽에서도 cors 설정이 되어 있어야 한다는 것.
하지만 담당자가 너무너무 바빠보이고 이거까지 할 시간이 부족한거같아서 2번의 방법을 선택해서 처리했다.
cros 세팅은 아래와 같다
response.addHeader("Access-Control-Allow-Origin","*");
response.setHeader("Access-Control-Allow-Headers","origin, x-requested-with, content-type, accept");
4) cors가 뜨지 않도록 설정
Crome 확장프로그램 이용 ( Allow CROS : Access-Control-Allow-Origin' 설치)
참고사이트
https://devlog-wjdrbs96.tistory.com/429
[Spring] Spring Security, React를 사용하면서 CORS 허용하는 방법
Spring에서 CORS 해결하는 법 이번 글에서는 개인적인 프로젝트를 하면서 겪었던 SOP 문제를 CORS를 허용해주면서 해결했던 과정에 대해서 공유해보려 합니다. (이 글에서는 CORS가 무엇인지에 대해서
devlog-wjdrbs96.tistory.com
https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_html&wr_id=293213
WWW.PHPSCHOOL.COM
개발자 커뮤니티 1위 PHPSCHOOL.COM 입니다.
www.phpschool.com
https://blog.naver.com/suin2_91/221335631026
ajax 크로스도메인 문제해결/ [Ajax] CrossDomain 설정
$.ajax() 같은 ajax관련 함수를 호출할 때 타겟이 되는 URL이 클라이언트와 다른 도메인이면 호출이 안...
blog.naver.com