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

小云云
풀어 주다: 2018-02-09 09:46:13
원래의
1558명이 탐색했습니다.

최근 공용 계정의 프론트엔드 개발 작업을 하다가 지역 내 성-시-군 3단계 연결, 3단계 연결 쿼리 등 Ajax 크로스 도메인 요청 문제에 직면했습니다. 자동차 브랜드-자동차 시리즈-자동차 모델 등은 모두 외부 인터페이스를 호출해야 합니다(다른 엔지니어링 프로젝트에 대한 인터페이스). 이 글에서는 주로 프론트엔드 크로스 도메인 요청 처리와 백엔드 크로스 도메인 데이터 처리 방법을 소개하고 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 메서드는 일반 json 문자열을 인쇄합니다. 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의 가장 기본적인 원칙은 <script> 태그를 동적으로 추가하는 것이며, 스크립트 태그의 src 속성에는 크로스 도메인 제한이 없습니다. 이러한 방식으로 이 크로스 도메인 방법은 ajax XmlHttpRequest 프로토콜과 아무 관련이 없습니다. <br></p> <p>JSONP는 스크립트 태그를 서버 측에 통합하여 클라이언트에 반환할 수 있도록 하는 비공식 프로토콜이며 크로스 도메인 액세스를 허용합니다. JSONP는 JSONP with Padding입니다. 동일 출처 정책의 제한으로 인해 XmlHttpRequest는 현재 소스(도메인 이름, 프로토콜, 포트)에서만 리소스를 요청할 수 있습니다. 도메인 간 요청을 하려면 html의 스크립트 태그를 사용하여 도메인 간 요청을 하고 응답에서 실행할 스크립트 코드를 반환하면 JSON을 사용하여 javascript 개체를 직접 전달할 수 있습니다. 이 도메인 간 통신 방법을 JSONP라고 합니다. </p> <p>jsonCallback 함수 jsonp1236827957501(....): 브라우저 클라이언트에 의해 등록됩니다. 크로스 도메인 서버에서 json 데이터를 얻은 후 콜백 함수 </p> <p><strong>Jsonp 원칙: </strong></p> <p>먼저 콜백을 등록합니다. 클라이언트(예: 'jsoncallback')를 호출한 다음 콜백 이름(예: jsonp1236827957501)을 서버에 전달합니다. 참고: 서버가 콜백 값을 얻은 후 jsonp1236827957501(...)을 사용하여 출력할 json 콘텐츠를 포함해야 합니다. 이때 서버에서 생성된 json 데이터를 클라이언트가 올바르게 수신할 수 있습니다. </p> <p>그런 다음 javascript 구문을 사용하여 함수를 생성합니다. 함수 이름은 전달된 매개 변수 'jsoncallback' jsonp1236827957501의 값입니다. </p> <p>마지막으로 json 데이터가 함수에 매개 변수로 직접 배치되어 단락 js 구문 문서가 생성됩니다. , 클라이언트에게 반환되었습니다. </p> <p>클라이언트 브라우저는 스크립트 태그를 구문 분석하고 반환된 자바스크립트 문서를 실행합니다. 이때 자바스크립트 문서 데이터는 클라이언트의 사전 정의된 콜백 함수(예: 위 예의 jquery $.ajax() 메서드에 매개변수로 전달됩니다. ) 캡슐화된 성공: 함수(json)).(동적 실행 콜백 함수)<br></p>jsonp 메서드는 기본적으로 <script src="http://cross-domain/... 과 동일하다고 할 수 있습니다. xx.js"> </script>는 일관성이 있습니다(qq space는 도메인 간 데이터 교환을 달성하기 위해 이 방법을 사용합니다). JSONP는 스크립트 삽입(ScriptInjection) 동작이므로 특정 보안 위험도 있습니다.

참고 , jquey Post 모드 교차 도메인은 지원되지 않습니다.

관련 권장 사항:

vue는 axios를 사용하여 자세한 예제와 함께 도메인 간에 데이터를 요청합니다.

Native JS는 ajax 및 ajax 교차 도메인 요청을 구현합니다.

예 Ajax 도메인 간 요청에 대해 자세히 설명


원칙

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿