• AJAX异步请求解决跨域问题的三种方式


    一 什么是跨域

    出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

    例如: 

    • 本地路径地址:http://127.0.0.1:8080/msb/index.jsp
    • https://127.0.0.1:8080/msb/index.jsp 协议不一样
    • http://192.168.24.11:8080/msb/index.jsp IP不一致
    • http://127.0.0.1:8888/msb/index.jsp 端口不一致
    • http://localhost:8080/msb/index.jsp IP不一致

    二 解决AJAX跨域请求的三种方式

    方式一  jsonp跨域处理

    代码演示如下:

    前端页面

    1. <html>
    2. <head>
    3. <title>$Title%sSourceCode%lt;/title>
    4. <meta charset="UTF-8"/>
    5. <script src="js/jquery.min.js">script>
    6. <script>
    7. function checkUname(){
    8. // 获取输入框中的内容
    9. if(null == $("#unameI").val() || '' == $("#unameI").val()){
    10. $("#unameInfo").text("用户名不能为空");
    11. return;
    12. }
    13. $("#unameInfo").text("");
    14. // 通过jQuery.ajax() 发送异步请求
    15. $.ajax(
    16. {
    17. type:"GET",// 请求的方式 GET POST
    18. url:"http://localhost:8080/ajaxDemo3_war_exploded/unameCheckServlet.do?", // 请求的后台服务的路径
    19. data:"uname="+$("#unameI").val(),// 提交的参数
    20. success:function(info){ // 响应成功执行的函数
    21. $("#unameInfo").text(info)
    22. }
    23. }
    24. )
    25. }
    26. script>
    27. head>
    28. <body>
    29. <form action="myServlet1.do" >
    30. 用户名:<input id="unameI" type="text" name="uname" onblur="checkUname()">
    31. <span id="unameInfo" style="color: red">span><br/>
    32. 密码:<input type="password" name="pwd"><br/>
    33. <input type="submit" value="提交按钮">
    34. form>
    35. body>
    36. html>

    浏览器请求该资源的地址是:
    http://127.0.0.1:8020/testa/index.html 
    但是其内部ajax请求的资源是http://localhost:8080/ajaxDemo3_war_exploded/unameCheckServlet.do?
    二者端口号和IP其实是不一致的,这就受到同源策略的控制

     

    实现的原理是什么?

    我们发现Web页面上调用js文件时则不受是否跨域的影响,拥有”src”这个属性的标签都却拥有跨域的能力,比如<\script>、<\img>、<\iframe>。那么跨域访问数据就有了一种可能,那就是在远程服务器上设法把数据装进js格式的文件里,供客户端调用和进一步处理。就好比使用一个