test.co.kr 이라는 사이트에서 dev.co.kr 이라는 사이트에 있는 정보를 Ajax 기술을 이용하여 요청을 보낼 때 cross domain policy에 의해 브라우저가 요청을 막는다.
즉, 도메인이 다르면 요청을 보낼 수 없다.
위와 같은 상황을 우회하여 해결할 수 있는 방법은 jquery에서 jsonp를 이용하는 것이다.
한 가지 주의해야 할점은 jsonp는 HTTP GET 방식만 지원한다.
jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
});
function getJsonTest1() {
$.getJSON("http://jsonp.localhost:8081/jsonpTest?id=user&callback=?",
function(data) {
alert(data.id + ", " + data.result);
}
);
}
function postJsonTest2() {
$.ajax({
type : "GET",
url : "http://jsonp.localhost:8081/jsonpTest",
data : "id=kyu",
dataType : "jsonp",
success : function(json) {
alert(json.id + ", " + json.result);
},
error : function(e) {
alert("error");
}
});
}
</script>
<a href="javascript:postJsonTest2();">
test
</a>
java 파일
@RequestMapping(value = "/jsonpTest", method = RequestMethod.GET)
@ResponseBody
public String jsonpTest(@RequestParam String id, @RequestParam String callback) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("id", id);
paramMap.put("result", "success");
String result = null;
ObjectMapper mapper = new ObjectMapper();
try {
result = mapper.writeValueAsString(paramMap);
} catch (JsonGenerationException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println(result);
return callback + "(" + result + ")";
}
크로스 도메인 요청 테스트를 위해 hosts 파일에 다음을 등록한다.
127.0.0.1 jsonp.localhost
Ajax 요청에 대한 HTTP request 및 response를 확인해 보면 다음과 같다.
HTTP request
HTTP response body
jQuery183023385174595750868_1373508690112({"id":"kyu","result":"success"})
크로스 도메인 제약을 피하기 위해 jsonp를 이용하여 우회를 하게 되는데 동작 원리가 잘 이해가 되지 않는다.
역시 자바스크립트는 어렵다.
조만간 자바스크립트 스터디 모임에 참여해서 빡시게 공부 좀 해야 겠다.
'프로그래밍' 카테고리의 다른 글
Collections.unmodifiableMap 메소드를 이용한 read-only 객체 만들기 (0) | 2013.08.28 |
---|---|
리눅스에서 java 컴파일 및 실행 하기 (4) | 2013.08.09 |
Mockito를 이용한 테스트 (0) | 2013.08.07 |
Serializable 객체직렬화 (1) | 2013.07.30 |
java 재귀함수 시퀀스 다이어그램 (0) | 2013.07.05 |
369 게임 알고리즘 (0) | 2013.06.26 |
java default 접근 제어자 활용 범위? (0) | 2013.06.13 |
정규표현식 (Java) (2) | 2013.05.09 |