태그 보관물: Javascript

jQuery의 JSONP을 사용한 크로스도메인간 통신

웹은 Same origin policy이 동일한 도메인상의 요청만 가능하도록 제한하였지만,
도메인간 데이터 통신으로부터 다이나믹한 웹구현을 위한 방법으로 JSONP가 나오게 된것이다.

jQuery의 ajax를 이용한 두가지 jsonp 요청 방법을 지금부터 소개 하겠습니다.

첫번째, 요청 URL뒤에 ?callback=? 추가하여 jsonp 요청 구현하기

jQuery 1.2부터는 JSONP 호출에 대한 네이티브 지원이 제공되고 있다. JSONP 콜백을 지정한 경우 다른 도메인에 있는 JSON 데이터를 로드할 수 있으며 JSON 콜백은 url?callback=? 라는 구문을 사용하여 지정할 수 있다.

$.getJSON() 방식을 살펴보면 url 맨 끝에 callback=이라는 문자열과 함께 실제 함수 이름 대신 ? 기호를 콜백 함수 이름으로 입력하는 것을 볼 수 있다.

이는 jQuery가 ? 기호를 인라인 함수를 호출하는 생성된 함수 이름(예:jsonp1234568416)으로 바꾸기 때문이다. 굳이 ? 을 적을 필요는 없고 따로 처리하는 콜백 함수가 있다면 해당 함수의 이름을 적어줘도 무방하다. (익명 메소드로 바로 처리할 경우 반드시 ? 를 써줄 것)

Client

$.getJSON("https://codejs.mycafe24.com/jsonp.json?callback=?",
  function(data) {
    console.log('성공 - ', data);
  }
);

Server (jquery에서 생성한 익명의 callback함수명을 받아 감싸서 응답 준비를 합니다.)

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
         
    String id = request.getParameter("id");
    String callBack = request.getParameter("callback");
 
    JSONObject obj = new JSONObject();
    obj.put("result", id);
    obj.put("go", "테스트");
         
    PrintWriter out = response.getWriter();
    out.write(callBack + "(" + obj.toString() + ")");
    System.out.println(callBack + "(" + obj.toString() + ")");
    out.flush();
    out.close();
}

두번째, 응답 json에 callback함수로 한번 감싸서 jsonp 구현하기

Client

$('a').click(function() {
  $.ajax({
    url: "https://codejs.mycafe24.com/jsonp.json",
    dataType: 'jsonp',
    jsonpCallback: "myCallback",
    success: function(data) {
      console.log('성공 - ', data);
    },
    error: function(xhr) {
      console.log('실패 - ', xhr);
    }
  });
});

Server

myCallback({"message":"You got an AJAX response via JSONP from another site!"});

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

서버에서 파라메터로 응답 JSON함수명을 생성하여 보안을 강화하는 방법도 있으니,
그부분은 http://stove99.tistory.com/10 이곳을 참고 하면됩니다.

세번째, jsonpCallback 옵션없이 사용하기.

Client

$('a').click(function() {
  $.ajax({
    url: "https://codejs.mycafe24.com/jsonp.json",
    dataType: 'jsonp',
    success: function(data) {
      console.log('성공 - ', data);
    },
    error: function(xhr) {
      console.log('실패 - ', xhr);
    }
  });
});

Server

jQuery18305806868467951786_1366340807385({"key":"value"});

jQuery18305806868467951786_1366340807385(요청시 마다 바뀜)은 jsonpCallback을 지정하지 않으면 jQuery에서 자동으로 callback 요청 매개변수를 자동 생성해서 요청한다.
요청을 받은 서버에서는 callback 매개변수값을 함수 호출 하듯 감싸서 응답하면 된다.

참고 : http://warmz.tistory.com/739

JavaScript for detecting browser language (브라우저 언어 추출)

현재 브라우저 언어 설정값을 가져오는 방법에는 IE와 비IE(파폭, 크롬 등등)의 차이가 있습니다.
IE의 navigator객체에는 systemLanguage, userLanguage, browserLanguage 가 있어 마치 브라우저 언어를 보여줄 것 같지만,
전혀 그렇지 않아 사람을 혼란에 빠트리죠.

혼란을 주는 IE전용 속성

  • navigator.userLanguage OS의 제어판 – 국가 및 언어 – 입력언어를 나타낸다.
  • navigator.browserLanguage, navigator.systemLanguage OS의 제어판 – 국가 및 언어 – 표시언어의 반환한다.(browserLanguage와 systemLanguage의 차이는 발견하지 못했다.)
  • 모두 OS 언어 설정과 연관되어있다
$(function(){
  /*
   * 비 IE에서는 navigator.language 로 브라우저 현재 설정된 언어를 쉽게 알 수 있으나,
   * IE에서는 브라우저에 설정된 언어를 알 수 있는 navigator.language 속성이 없기때문에,
   * HTTP 응답 헤더값을 알아와야 하는 별도 처리가 슬프게도 필요 합니다.
   */
  var language;
  if (navigator.language) {
    // 비 IE에서 작동
    language = navigator.language
  } else {
    // IE에서 작동
    $.ajax({
      url: "http://ajaxhttpheaders.appspot.com",
      dataType: 'jsonp',
      success: function(headers) {
        language = headers['Accept-Language'];
        alert(language) // 요청 헤더에서 추출한 사용자 브라우저의 언어를 열거합니다.
      }
    });
  }
});

jQuery 1.7

jQuery 1.7 버전이 출시되었습니다.  (안녕 타코’s 님의 블로그 구경중 우연히 발견)
이벤트 처리를 위한 on(), off() 함수의 추가가 눈에 띄는 부분이고,
delageted 이벤트 전달 시간이 개선되었습니다.

http://code.jquery.com/jquery-1.7.js
http://code.jquery.com/jquery-1.7.min.js

jQuery 1.7에서는 다음과 같은 사항들이 추가 또는 개선되었습니다.

  • .on() .off() API 추가
  • Delegated 이벤트의 성능 향상
  • IE6/IE7/IE8에서 HTML5의 더 나은 지원
  • 토글링 애니메이션의 직관적인 동작
  • AMD(Asynchronous Module Definition) API 지원
  • jQuery.Deferred 객체 확장
  • jQuery.isNumeric() 추가 – 매개변수의 정수 여부 체크 함수

삭제된 내용은 다음과 같습니다.

  • event.layerX와 event.layerY 속성 제거
  • jQuery.isNaN() 함수 제거
  • jQuery.event.proxy() 함수 제거

[참고] http://blog.jquery.com/2011/11/03/jquery-1-7-released/