>  기사  >  웹 프론트엔드  >  Ajax 프런트엔드 및 백엔드 교차 도메인 요청 처리 방법

Ajax 프런트엔드 및 백엔드 교차 도메인 요청 처리 방법

韦小宝
韦小宝원래의
2018-02-10 10:37:391493검색

이 기사에서는 Ajax 프런트엔드 크로스 도메인 요청 처리 및 백엔드 크로스 도메인 데이터 처리 방법을 소개하고 Ajax 크로스 도메인 문제를 자세히 분석합니다. -end 교차 도메인 요청 처리 방법은 이 문서를 읽을 수 있습니다.

최근 공용 계정의 프론트엔드 개발 작업을 하다가 지역 내 성-시-군 3단계 연결, 3단계 연결 등 Ajax 크로스 도메인 요청 문제에 직면했습니다. 자동차 브랜드-자동차 시리즈-자동차 모델 등의 연결 쿼리를 모두 외부에서 호출해야 합니다. 인터페이스(다른 엔지니어링 프로젝트에 대한 인터페이스)가 완성되었습니다. 이제 크로스 도메인 요청에 대한 개인적인 솔루션을 공유하겠습니다. 물론 백그라운드 프로그래머의 도움으로 그 출처를 빠르게 파악하고 천천히 축적해 놓았으니 모든 분들께 도움이 되었으면 좋겠습니다. 또한 적극적으로 의견이나 제안을 제공해 주시기 바랍니다.

교차 도메인 요청은 백그라운드 코드를 사용하여 콜백콜백 함수를 수신하고 json 데이터를 추가로 처리해야 합니다. 그런 다음 프런트엔드는 ajax 요청을 사용하여 콜백 매개변수를 서버에 보내고 데이터 형식을 jsonp로 지정합니다.

1. 백그라운드는 도메인 간 요청을 처리합니다.

1.CarBrandController.java(자동차 브랜드 인터페이스 Java 파일), 여기에 나열된 방법은 주로 다양한 레벨 값을 기반으로 해당 브랜드, 자동차 시리즈 및 자동차 모델을 쿼리하는 데 사용됩니다. 여기서는 교차 도메인 요청에 대해 콜백 함수가 처리됩니다. 반환된 콜백이 null이면 특별한 처리가 필요하지 않습니다. 반환된 콜백이 아닌 경우에는 직접 인쇄하면 됩니다. null이면 도메인 간 요청을 나타냅니다. 이때 json 데이터에 대한 특수 처리가 필요합니다. 즉, json 데이터의 외부 레이어에 괄호 쌍이 추가됩니다. 자세한 내용은 printlnJSONObject 메서드를 참조하세요. HttpAdapter.java 파일.

public void json(HttpServletRequest request,HttpServletResponse response){ 
  Map<String,Object>map=new HashMap<String, Object>(); 
  String id = request.getParameter("id");      //接收ajax请求带过来的id 
  String level = request.getParameter("level");   //接收ajax请求带过来的level 
  String callback=request.getParameter("callback"); //接收ajax请求带过来的callback参数 
  if ("1".equals(level)) {             //如果level是&#39;1&#39;,则查询第一级目录内容 
    map.put("results", this.carBrandService.findByAttr(null, "first_letter asc")); //调用查询方法,结果放入map 
  } else if ("2".equals(level)) {          //如果level是&#39;2&#39;,则查询第二级目录内容 
    map.put("results", this.carSerieService.findByAttr("parent_id="+id, "first_letter asc"));//调用查询方法,结果放入map 
  } else if ("3".equals(level)) {          //如果level是&#39;3&#39;,则查询第三极目录内容 
    map.put("results", this.carModelYearService.findByAttr("parent_id="+id, "jian_pin desc"));//调用查询方法,结果放入map 
  } 
  map.put("level",level); 
  if (null==callback) {               //如果接收的callback值为null,则是不跨域的请求,输出json对象 
    HttpAdapter.printlnObject(response, map); 
  }else{                      //如果接收的callback值不为null,则是跨域请求,输出跨域的json对象 
  HttpAdapter.printlnJSONPObject(response, map, callback); 
  } 
}

2.HttpAdapter.java(출력 개체의 Java 파일), printlnObject 메서드는 일반 jsonstring을 인쇄합니다. printlnJSONObject 메서드는 json 문자열에 대해 특수 처리를 수행합니다.

/** 
 * 打印对象 
 * @param response 
 * @param object 
*/ 
public static void printlnObject(HttpServletResponse response,Object object){ 
  PrintWriter writer=getWriter(response); 
  writer.println(JSON.toJSONString(object)); 
} 
/** 
 * 打印跨域对象 
 * @param response 
 * @param object 
*/ 
public static void printlnJSONPObject(HttpServletResponse response,Object object,String callback){ 
  PrintWriter writer=getWriter(response); 
  writer.println(callback+"("+JSON.toJSONString(object)+")"); 
}

2. 프런트엔드 ajax 도메인 간 요청 데이터

작성 방법 1: 매개변수 콜백=을 서버로 보내시겠습니까? , dataType을 'jsonp' 형식으로 지정합니다. 도메인 간 요청 중에 지정된 데이터 형식은 jsonp 형식이어야 합니다.

function loadData(obj,level,id,value){ 
  $.ajax({  
    url:&#39;http://192.168.1.106:8086/carBrand/json.html?level=&#39;+level+&#39;&id=&#39;+id+&#39;&callback=?&#39;,   //将callback写在请求url后面作为参数携带 
    type:&#39;GET&#39;, 
    async:false, 
    dataType:&#39;jsonp&#39;, 
    success:function(data){         
      console.log(data);             
      //其他处理(动态添加数据元素)       
  });    
}

작성방법 2: 콜백은 URL에 작성할 필요는 없으나, jsonp 매개변수를 'callback'으로 지정하고 jsonpCallback 매개변수에 값을 주어야 합니다.

function loadData(obj,level,id,value){ 
  $.ajax({  
    url:&#39;http://192.168.1.106:8086/carBrand/json.html?level=&#39;+level+&#39;&id=&#39;+id, 
    type:&#39;GET&#39;, 
    dataType:&#39;jsonp&#39;, 
    jsonp: &#39;callback&#39;,          //将callback写在jsonp里作为参数连同请求一起发送 
    jsonpCallback:&#39;jsonpCallback1&#39;,    
    success:function(data){            
    console.log(data);       
}); }

위의 두 가지 표기법은 같은 의미이지만 표기법이 다릅니다.

다음으로 jsonp의 작동 원리를 추가해 보겠습니다.

3. jsonp의 크로스 도메인 원칙 분석

jsonp의 가장 기본적인 원칙은 3f1c4e4b6b16bbbd69b2ee476dc4f83a 태그를 동적으로 추가하는 것이며, 스크립트 태그의 src 속성에는 크로스 도메인 제한이 없습니다. 이러한 방식으로 이 교차 도메인 방법은 실제로 ajax 도메인 액세스 JSONP와 아무 관련이 없습니다. JSONP는 Padding이 있는 JSON입니다. 동일 출처 정책의 제한으로 인해 XmlHttpRequest는 현재 소스(도메인 이름, 프로토콜, 포트)에서만 리소스를 요청할 수 있습니다. 도메인 간 요청을 하고 싶다면 html의 스크립트 태그를 사용하여 도메인 간 요청을 하고 응답에서 실행할 스크립트 코드를 반환할 수 있습니다. 여기서
javascript 개체

는 다음을 사용하여 직접 전달할 수 있습니다. JSON. 이 도메인 간 통신 방법을 JSONP라고 합니다.

jsonCallback 함수 jsonp1236827957501(....): 브라우저 클라이언트에 의해 등록됩니다. 크로스 도메인 서버에서 json 데이터를 얻은 후 콜백 함수 Jsonp 원칙:

먼저 콜백을 등록합니다. 클라이언트(예: 'jsoncallback')를 호출한 다음 콜백 이름(예: jsonp1236827957501)을 서버에 전달합니다. 참고: 서버가 콜백 값을 얻은 후 jsonp1236827957501(...)을 사용하여 출력할 json 콘텐츠를 포함해야 합니다. 이때 서버에서 생성된 json 데이터를 클라이언트가 올바르게 수신할 수 있습니다.

그런 다음 javascript 구문을 사용하여 함수를 생성합니다. 함수 이름은 전달된 매개 변수 'jsoncallback' jsonp1236827957501의 값입니다.

마지막으로 json 데이터가 함수에 매개 변수로 직접 배치되어 단락 js 구문 문서가 생성됩니다. , 클라이언트에게 반환되었습니다.

클라이언트 브라우저는 스크립트 태그를 구문 분석하고 반환된 자바스크립트 문서를 실행합니다. 이때 자바스크립트 문서 데이터는 클라이언트의 사전 정의된 콜백 함수(예: 위 예의 jquery $.ajax() 메서드에 매개변수로 전달됩니다. ) 캡슐화된 성공: 함수(json)).(동적 실행 콜백 함수)

jsonp 메서드는 기본적으로 acbd3e25f4f5db725f8fb357282ea4f6 2cacc6d41bbb37262a98f745aa00fbf0는 일관성이 있습니다(qq space는 도메인 간 데이터 교환을 달성하기 위해 이 방법을 사용합니다). JSONP는 스크립트 삽입(ScriptInjection) 동작이므로 특정 보안 위험도 있습니다.

참고 , jquey 교차 도메인 게시 방법은 지원되지 않습니다.


위 내용이 전부입니다. Ajax 교차 도메인 요청에 익숙하지 않다면 더 읽어보세요!

유사 기사 추천: ​​

Ajax 크로스 도메인 액세스 오류 501에 대한 해결 방법을 예시와 함께 자세히 설명

이 기사에서는 주로 ajax 크로스 도메인 액세스 오류 501에 대한 해결 방법을 자세히 소개하고 있으며 특정 참조 값이 있어 흥미롭습니다. ...

Ajax 크로스 도메인 완벽한 솔루션 예시 공유

회사에서 이벤트 페이지를 만들고 싶어하는데 그 과정에서 모든 인터페이스가 발견되고 Ajax 요청이 크로스 도메인으로 이루어집니다. 크로스 도메인에 대한 간략한 소개입니다...

Ajax 크로스 도메인 접속 쿠키 손실 문제에 대한 해결 방법_AJAX 관련

이 글에서는 주로 Ajax 크로스 도메인 접속 시 쿠키 손실 문제에 대한 해결 방법을 소개합니다. . 친구가 참고하면 됩니다...

위 내용은 Ajax 프런트엔드 및 백엔드 교차 도메인 요청 처리 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.