이 글에서는 프론트엔드 크로스 도메인 요청 처리와 백엔드 크로스 도메인 데이터 처리 방법을 소개하고, Ajax의 크로스 도메인 문제를 자세히 분석합니다.
최근 공용 계정의 프론트엔드 개발 작업을 하다가 지역 내 성-시-군 3단계 연결, 3단계 연결 등 Ajax 크로스 도메인 요청 문제에 직면했습니다. 자동차 브랜드-자동차 시리즈-자동차 모델 등의 연결 쿼리를 모두 외부에서 호출해야 합니다. 인터페이스(다른 엔지니어링 프로젝트에 대한 인터페이스)가 완성되었습니다. 이제 크로스 도메인 요청에 대한 개인적인 솔루션을 공유하겠습니다. 물론 백그라운드 프로그래머의 도움으로 그 출처를 빠르게 파악하고 천천히 축적해 놓았으니 모든 분들께 도움이 되었으면 좋겠습니다. 또한 적극적으로 의견이나 제안을 제공해 주시기 바랍니다.
교차 도메인 요청은 백그라운드 코드를 사용하여 콜백 함수를 수신하고 프런트엔드에서 json 데이터를 추가로 처리한 다음 ajax 요청을 사용하여 콜백 매개변수를 서버에 보내고 데이터 형식을 jsonp로 지정해야 합니다.
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是'1',则查询第一级目录内容 map.put("results", this.carBrandService.findByAttr(null, "first_letter asc")); //调用查询方法,结果放入map } else if ("2".equals(level)) { //如果level是'2',则查询第二级目录内容 map.put("results", this.carSerieService.findByAttr("parent_id="+id, "first_letter asc"));//调用查询方法,结果放入map } else if ("3".equals(level)) { //如果level是'3',则查询第三极目录内容 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)+")"); }
작성 방법 1: 매개변수 콜백=을 서버로 보내시겠습니까? , dataType을 'jsonp' 형식으로 지정합니다. 도메인 간 요청 중에 지정된 데이터 형식은 jsonp 형식이어야 합니다.
function loadData(obj,level,id,value){ $.ajax({ url:'http://192.168.1.106:8086/carBrand/json.html?level='+level+'&id='+id+'&callback=?', //将callback写在请求url后面作为参数携带 type:'GET', async:false, dataType:'jsonp', success:function(data){ console.log(data); //其他处理(动态添加数据元素) }); }
작성방법 2: 콜백은 URL에 작성할 필요는 없으나, jsonp 매개변수를 'callback'으로 지정하고 jsonpCallback 매개변수에 값을 주어야 합니다.
function loadData(obj,level,id,value){ $.ajax({ url:'http://192.168.1.106:8086/carBrand/json.html?level='+level+'&id='+id, type:'GET', dataType:'jsonp', jsonp: 'callback', //将callback写在jsonp里作为参数连同请求一起发送 jsonpCallback:'jsonpCallback1', success:function(data){ console.log(data); }); }
위의 두 가지 표기법은 같은 의미이지만 표기법이 다릅니다.
다음으로 jsonp의 작동 원리를 추가해 보겠습니다.
jsonp의 가장 기본 원칙은 <script> 태그를 동적으로 추가하고 스크립트 태그의 src 속성에는 도메인 간 제한이 없습니다. 이러한 방식으로 이 크로스 도메인 방법은 ajax XmlHttpRequest 프로토콜과 아무 관련이 없습니다. </p> <p>JSONP는 스크립트 태그를 서버 측에 통합하여 클라이언트에 반환하고 JSONP에 대한 도메인 간 액세스를 허용하는 비공식 프로토콜입니다. 이는 패딩이 포함된 JSON인 자바스크립트 콜백을 통해 달성됩니다. 동일 출처 정책의 제한으로 인해 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) 동작이므로 특정 보안 위험도 있습니다.
The 위는 제가 모든 사람을 위해 편집한 것입니다. 앞으로 모든 사람에게 도움이 되기를 바랍니다. 관련 기사:NodeJS를 사용하여 WebSocket 기능을 구현하는 방법
위 내용은 Ajax 프런트엔드 및 백엔드 교차 도메인 요청을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!