zoukankan      html  css  js  c++  java
  • Jquery:ajax跨域请求处理

       昨天朋友想做个图片懒加载的效果,朋友是前端的,我这边给他提供数据,程序写好了放到服务器上,本地测试访问时却报jquery跨域的问题,于是找度娘了解了一下jquey如何处理,网上有很多参考文章,但没细看,此情况会造成知识的不全面,望谅解,找了两个解决方案,具体如下:

        1直接在ashx中加入以下代码:

     context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

      Access-Control-Allow-Origin:* 表示允许任何域名跨域访问,如果需要指定某域名才允许跨域访问,只需把Access-Control-Allow-Origin:*改为Access-Control-Allow-                                                        Origin:允许的域名,例如:Add('Access-Control-Allow-Origin:http://www.client.com');

       2在不加 Access-Control-Allow-Origin 的情况下,在服务器返回jsonp(若不明白可度娘一下)格式的数据,注意:jsonp的返回格式为 sucess([{},{},...])或success({});当服务器返回jsonp的数据,前端js要对应的修改一下才能正确执行,代码如下:

         服务器代码:

     1  protected string LazyData()
     2     {
     3         List<AjaxData> list = new List<AjaxData>();
     4         int pageIndex = Convert.ToInt32(Request.Params["pageIndex"]);
     5         int pageSize = Convert.ToInt32(Request.Params["pageSize"]);
     6         int start = ((pageIndex - 1) * 10) + 1;
     7         int end = pageIndex * pageSize;
     8         string sql = @"SELECT * from (select ROW_NUMBER() OVER (ORDER BY id) as num,* from FeiShen) tt WHERE  tt.num BETWEEN " + start + " AND " + end + "";
     9         DataTable table = SqlHelper.ExcuteToTable(sql);
    10         if (table != null && table.Rows.Count > 0)
    11         {
    12             foreach (DataRow item in table.Rows)
    13             {
    14                 AjaxData data = new AjaxData()
    15                 {
    16                     ImageUrl = item["ImageUrl"].ToString(),
    17                     Price = item["Price"].ToString(),
    18                     Text = item["Text"].ToString()
    19                 };
    20                 list.Add(data);
    21             }
    22         }
    23         System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
    24         return "success("+ ser.Serialize(list)+")";//这里拼接jsonp数据格式
    25     }
    26 
    27     //-------------拓展类------------------
    28     public class AjaxData
    29     {
    30         public string ImageUrl { get; set; }
    31         public string Price { get; set; }
    32         public string Text { get; set; }
    33     }
    View Code

        前端js调用:  

     1   $.ajax({
     2                 url: 'http://www.jean69.com/FeiShen/Ajax/Data2.ashx',
     3                 type: 'GET',
     4                 dataType: 'jsonp',
     5                 jsonp: 'callback',
     6                 jsonpCallback: "success",//这里指定回调函数为success
     7                 cache: false,
     8                 data: { pageIndex: 1, pageSize: 10, type: 'lazyData' },
     9                 success: function (data) {
    10                     if (data.length > 0)
    11                     {
    12                         for (var i = 0; i < data.length; i++) {
    13                             var str = "<ul><li>" + data[i].ImageUrl + "</li></ul>";
    14                             $("#content").append(str);
    15                         }
    16                     }
    17                 }
    18             });
    View Code

      知识普及: 

        a、什么是jsonp:JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)

        b、jsonp的作用:由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求

        c、如何使用JSONP:上面的实例实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数

  • 相关阅读:
    新版本ADT创建Android项目无法自动生成R文件解决办法
    关联android-support-v4源码关联不上的解决办法
    关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法
    如何使用RadioGroup和RadioButton实现FragmentTabHost导航效果?
    ProgressBar+WebView实现自定义浏览器
    Android之ProgressBar读取文件进度解析
    Android开发之ListView添加多种布局效果演示
    ubuntu释放snapd旧文件
    rte_kni
    follow RISC-V
  • 原文地址:https://www.cnblogs.com/jean69/p/6135671.html
Copyright © 2011-2022 走看看