• 跨域的简单研究


    跨域的解决方案:
    1,使用jsonp来解决;
    2,使用cros来解决;
     
     
    分别写两个例子:
     
     
    比如  x.3333.cn 
     
    普通访问     get
    jsonp访问   get
    cros访问     post
     
     
    访问 x.4444.cn 的某个接口
       http://x.4444.cn/hello.do             普通接口
       http://x.4444.cn/helloJsonP.do     支持jsonp的接口
       http://x.4444.cn/helloCros.do       支持cros的接口
       
     
     
    分别进行测试,观察:
     
     
    科普下知识点:
     
     
    jsonp    利用页面中创建<script>节点的方法向不同域名提交http请求的方法叫做 jsonp;
     
    实现原理:
     
    cors        cross origin resource sharing  跨域资源共享,
    实现原理:  可以让ajax实现跨域访问,只需要服务器端返回一个响应头即可;
     
    关键的后端代码:
     1 package test.helper;
     2 
     3 import com.google.gson.Gson;
     4 import javafx.scene.chart.PieChart;
     5 import test.model.response.LoginResponse;
     6 
     7 import javax.servlet.http.HttpServletRequest;
     8 import javax.servlet.http.HttpServletResponse;
     9 import java.io.IOException;
    10 
    11 /**
    12  * Created by carter on 2016/3/29.
    13  */
    14 public final class ResponseHelper {
    15 
    16     /**
    17      * 写回json数据到客户端,如果是字符串或者int ,long 直接原样写回去
    18      * @param response
    19      * @param responseData
    20      */
    21     public static void write(HttpServletResponse response, Object responseData) {
    22 
    23         String responseMsg = getJsonString(responseData);
    24 
    25         writeString(response, responseMsg);
    26 
    27 
    28     }
    29 
    30     /**
    31      * 返回jsonp数据
    32      * @param request
    33      * @param response
    34      * @param responseMsg
    35      */
    36     public static void writeJsonp(HttpServletRequest request, HttpServletResponse response,Object responseMsg) {
    37 
    38         String jsoncallback = request.getParameter("jsoncallback");
    39 
    40         String jsonString = getJsonString(responseMsg);
    41 
    42         if(null !=jsoncallback &&  !"".equals(jsoncallback))
    43         {
    44             jsonString = jsoncallback + "(" +jsonString+")";
    45         }
    46 
    47         writeString(response,jsonString);
    48 
    49 
    50     }
    51 
    52 
    53     private static void writeString(HttpServletResponse response, String responseMsg) {
    54         try {
    55             response.getWriter().write(responseMsg);
    56         } catch (IOException e) {
    57             e.printStackTrace();
    58         }
    59     }
    60 
    61     private static String getJsonString(Object responseData) {
    62         String responseMsg = "";
    63 
    64         if(null == responseData)
    65         {
    66              responseMsg = "responseData is empty";
    67         }
    68         else
    69         {
    70             if(responseData instanceof  String || responseData instanceof Integer || responseData instanceof Long )
    71             {
    72                 responseMsg = String.valueOf(responseData);
    73             }
    74             else
    75             {
    76                 responseMsg = new Gson().toJson(responseData);
    77             }
    78         }
    79         return responseMsg;
    80     }
    81 
    82 
    83     /**
    84      * 提供cros支持
    85      * @param response
    86      * @param data
    87      */
    88     public static void writeCors(HttpServletResponse response, Object data) {
    89 
    90         response.addHeader("Access-Control-Allow-Origin","*");
    91         response.addHeader("Access-Control-Allow-Methods","GET,POST,OPTIONS");
    92         response.addHeader("Access-Control-Allow-Headers","Origin,No-Cache,X-Requested-With,If-Modified-Since,Pragma,Last-Modified,Cache-Control,Expires,Content-Type,X-E4M-With");
    93 
    94         writeString(response,getJsonString(data));
    95     }
    96 }

    关键前端代码:

    jsonp的:

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     2 <html>
     3 <head>
     4     <title>jsonp方式访问接口</title>
     5 </head>
     6 <body>
     7 <button  class="cliMe">点我</button> <br>
     8 <h1 class="hello"> hello</h1><br>
     9 <jsp:include page="common/back.jsp" flush="false"/>
    10 </body>
    11 <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
    12 <script type="text/javascript">
    13     $(function(){
    14 
    15         $(".cliMe").bind("click",function(){
    16             $.ajax({url:'http://y.4444.cn:8080/helloJsonp',
    17                 type:'get',
    18                 async: false,
    19                 dataType:'jsonp',
    20                 jsonp:'jsoncallback',
    21                 jsonpCallback:'callback'+new Date().getTime(),
    22                 success:function(data)
    23                 {
    24                     $(".hello").empty().html('hello , dear '+ data.username + " , you age is " + data.age);
    25                 },
    26                 error:function(){alert('error');}
    27             });
    28 
    29         });
    30 
    31     });
    32 </script>
    33 </html>

    cors访问的前端代码:

     1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
     2 <html>
     3 <head>
     4     <title>cors方式访问接口</title>
     5 </head>
     6 <body>
     7 <button  class="cliMe">点我</button> <br>
     8 <h1 class="hello"> hello</h1><br>
     9 <jsp:include page="common/back.jsp" flush="false"/>
    10 </body>
    11 <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
    12 <script type="text/javascript">
    13     $(function(){
    14 
    15         $(".cliMe").bind("click",function(){
    16 
    17             var url = 'http://y.4444.cn:8080/helloCors';
    18             var xhr = createCORSRequest('POST', url);
    19             if (!xhr) {
    20                 alert('CORS not supported');
    21                 return;
    22             }
    23 
    24             // 回应处理
    25             xhr.onload = function() {
    26                 var text = xhr.responseText;
    27                 var data = JSON.parse(text);
    28                 $(".hello").empty().html('hello , dear '+ data.username + " , you age is " + data.age);
    29             };
    30 
    31             xhr.onerror = function() {
    32                 alert('Woops, there was an error making the request.');
    33             };
    34 
    35             xhr.send();
    36 
    37 
    38         });
    39 
    40     });
    41 
    42     function createCORSRequest(method, url) {
    43         var xhr = new XMLHttpRequest();
    44         if ("withCredentials" in xhr) {
    45             // 针对Chrome/Safari/Firefox.
    46             xhr.open(method, url, true);
    47         } else if (typeof XDomainRequest != "undefined") {
    48             // 针对IE
    49             xhr = new XDomainRequest();
    50             xhr.open(method, url);
    51         } else {
    52             // 不支持CORS
    53             xhr = null;
    54         }
    55         return xhr;
    56     }
    57 </script>
    58 </html>

    简单的测试情况:

    普通方式:

    jsonp方式:

    cors方式:

     
    简单的测试小结:

    1,使用普通的ajax访问非本域名之外的资源会有跨域问题;
    2,jsonp支持get方式的跨域,比较通用;
    3,cors支持get,post方式的跨域;但是取决于浏览器的版本限制;
    4,更深入的研究,可以参阅Http权威指南。

     
     
     
     
  • 相关阅读:
    家长如何助力孩子适应小学生活
    一年级线上家长会
    gdb常用调试命令
    二叉树-后序遍历
    机器人
    Oracle创建只读账号的详细步骤
    ORACLE RAC日常运维-调整RAC+DG环境redo大小
    Redis 延迟分析
    oracle dataguard 重启步骤
    catalog start with + switch database to copy的妙用
  • 原文地址:https://www.cnblogs.com/snidget/p/5341092.html
Copyright © 2020-2023  润新知