Cette fois, je vais vous montrer comment utiliser les requêtes cross-domaines Ajax, et quelles sont les précautions lors de l'utilisation des requêtes cross-domaines Ajax. Voici des cas pratiques, jetons un coup d'œil.
Cet article racontera l'histoire d'un novice qui a rencontré un problème inter-domaines mais ne savait pas qu'il s'agissait d'un problème inter-domaines, puis a su que c'était un problème inter-domaines mais ne savait pas comment pour le résoudre, puis résolu le problème inter-domaines, et finalement trouvé deux façons de résoudre ajax L'ensemble du processus des problèmes inter-domaines.
Je ne sais pas s'il s'agit d'un problème inter-domaines
La raison est la suivante : Afin de réutiliser et de réduire les développements répétés, un utilisateur distinct gestion des droits a été développé et d'autres systèmes obtiennent des informations d'authentification et d'autorisation, appelons-le système A pour le moment ; prenons le système B comme exemple pour appeler le système A. Dans le système B, j'ai utilisé ajax pour appeler l'interface du système A (le format des données est json). J'étais très confus à l'époque. Accéder à l'URL correspondante dans le système A peut renvoyer normalement des données json, mais utiliser ajax pour demander la même chose. L'URL dans le système B est un peu déroutante. Il n'y a eu aucune réaction de la part de l'enfant, comme si de rien n'était. Après des changements répétés comme celui-ci pendant longtemps, je n'arrivais toujours pas à le résoudre, alors j'ai demandé de l'aide à mes collègues et m'ai rappelé qu'il pourrait s'agir d'un problème inter-domaines ajax, j'ai donc résolu le problème en tant que problème inter-domaines. .
Connaître le cross-domain mais ne sait pas comment le résoudre
Connaissant la cause exacte du problème, il ne reste plus qu'à trouver une solution au problème. J'ai cherché longtemps sur Google, et encore une fois, sous la direction d'un collègue, j'ai appris que l'ajax de jQuery possède des attributs tels que jsonp, qui peuvent être utilisés pour résoudre des problèmes inter-domaines.Trouver une solution
Maintenant que nous savons comment résoudre le problème inter-domaines, le reste concerne les détails de mise en œuvre. Les erreurs sont inévitables pendant le processus de mise en œuvre. Parce que je n'ai pas compris la différence entre les deux formats json et jsonp, j'ai également fait une erreur. Il m'a fallu beaucoup de temps pour la résoudre sur Google. Tout d'abord, examinons une version simple de la façon d'utiliser l'ajax de jQuery pour résoudre des problèmes inter-domaines sur la page :$(document).ready(function(){ var url='http://localhost:8080/WorkGroupManagment/open/getGroupById" +"?id=1&callback=?'; $.ajax({ url:url, dataType:'jsonp', processData: false, type:'get', success:function(data){ alert(data.name); }, error:function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); }}); });
Comparez la différence entre le format json et jsonp :
format json :
{ "message":"获取成功", "state":"1", "result":{"name":"工作组1","id":1,"description":"11"} }
format jsonp :
callback({ "message":"获取成功", "state":"1", "result":{"name":"工作组1","id":1,"description":"11"} })
Le code Java d'arrière-plan final est le suivant :
@RequestMapping(value = "/getGroupById") public String getGroupById(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response) throws IOException { String callback = request.getParameter("callback"); ReturnObject result = null; Group group = null; try { group = groupService.getGroupById(id); result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS); } catch (BusinessException e) { e.printStackTrace(); result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED); } String json = JsonConverter.bean2Json(result); response.setContentType("text/html"); response.setCharacterEncoding("utf-8"); PrintWriter out = response.getWriter(); out.print(callback + "(" + json + ")"); return null; }
type de données comme jsonp ajax pour un traitement ultérieur.
Bien que cela résolve le problème inter-domaines, passons en revue les causes de l'erreur d'analyse. La raison en est que traiter aveuglément les données au format json comme des données au format jsonp à traiter par ajax, ce qui entraîne cette erreur. À l'heure actuelle, le code côté serveur ressemble à ceci :@RequestMapping(value = "/getGroupById") @ResponseBody public ReturnObject getGroupById(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response){ String callback = request.getParameter("callback"); ReturnObject result = null; Group group = null; try { group = groupService.getGroupById(id); result = new ReturnObject(group, "获取成功", Constants.RESULT_SUCCESS); } catch (BusinessException e) { e.printStackTrace(); result = new ReturnObject(group, "获取失败", Constants.RESULT_FAILED); } return result; }
Voyons comment utiliser le plug-in jquery-jsonp pour résoudre des problèmes inter-domaines.
var url="http://localhost:8080/WorkGroupManagment/open/getGroupById" +"?id=1&callback=?"; $.jsonp({ "url": url, "success": function(data) { $("#current-group").text("当前工作组:"+data.result.name); }, "error": function(d,msg) { alert("Could not find user "+msg); } });
Supplément : Il existe trois solutions aux problèmes inter-domaines Ajax :
1. Résoudre les problèmes inter-domaines via un intermédiaire. couche de transition
(1) Utilisez le serveur proxy Web pour isoler uniformément les applications dans différents domaines via le serveur proxy. Toutes les applications sont sous un seul nom de domaine. (Comme Apache, nginx, etc.)(2)跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成“跨域访问”的工作。
2.通过