防止跨域(jsonp详解)

详见:http://www.cnblogs.com/lemontea/archive/2012/12/11/2812268.html

$("#getJsonpByJquery").click(function () {
    $.ajax({
        url: 'http://localhost:2701/home/somejsonp',
        dataType: "jsonp",  //jsonp格式
        jsonp: "callback", //jsonp的回调函数
  jsonpCallback:"jsonCallBack", //指定回调函数 需要在后台中做下处理 success: function (data) { console.log(data) } }) })


完整Demo两种方法:js


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>jsonpAjaxCall.html</title>
<script type="text/javascript" src="/javascript/jquery.js"></script>
<script type="text/javascript">
  function jsonCallBack(d){ alert("123"); }
  function HuiDiaoMethod(d){console.log(d); }
  $(function(){
    //第一种方法:更原生些,但毕竟麻烦,需要向Dom树中添加script节点 需要回调函数
    $("#send").on('click', function(event) {
      //</script> 注意这里有一个转义字符 /
      $("<script></script>").attr("src","http://10.1.56.153:6631/ajaxcall.ashx?callback=HuiDiaoMethod").appendTo('body');
    });


    //推荐第二种方法:简单(无需添加script节点 无需要回调函数)
    $("#ajax").on("click",function(){
      $.ajax({

        "url":"http://10.1.56.153:6631/ajaxcall.ashx",

        "dataType":"jsonp",
        jsonp: "callback", //回调函数在QueryString中的键值,默认是callback。后台Request["callback"] 获取回调函数名称
        jsonpCallback:"jsonCallBack", //指定回调函数 需要在后台中做下处理
        success: function (data) { //data是json对象 后台最终输出的是 jsonCallBack(data)
                        console.log(data)
                     }
         });
     });
  });
</script>
</head>
<body>
<button id="send">getJsonp</button>
<button id="ajax">AjaxgetJsonp</button>
</body>
</html>

 

 备注:

后台返回的数据格式必须是:

MethodName(参数);

参数可以是json格式 也可以不是json格式。 但一定要是上面的格式 否则js会报错。

补充:

Access-Control-Allow-Origin

只有当目标页面的response中,包含了 Access-Control-Allow-Origin 这个header,并且它的值里有我们自己的域名时,浏览器才允许我们拿到它页面的数据进行下一步处理。

protected override void Application_BeginRequest(object sender, EventArgs e)
{             
                //HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpRequest request = HttpContext.Current.Request;
                string orig = request.Headers.Get("Origin");
                if (!string.IsNullOrEmpty(orig)&& request.UrlReferrer!=null&&!string.IsNullOrEmpty(request.UrlReferrer.Host))
                {
                    var host = request.UrlReferrer.Host;
                    orig = request.UrlReferrer.Scheme+"://"+ host;
                    if (request.UrlReferrer.Port != 80 && request.UrlReferrer.Port != 443)
                    {
                        orig += ":" + request.UrlReferrer.Port;
                    }
                    //不是 CookieDomain指定的域名下的请求全部拒绝。
                    if (!host.EndsWith(ConfigurationManager.AppSettings["CookieDomain"]??"localhost",StringComparison.OrdinalIgnoreCase))
                    {
                        // TODO:refuse
                  orig =string.empty;
            } 
          }

else if (!ConfigurationManager.AppSettings["Static"].Equals(orig, StringComparison.CurrentCultureIgnoreCase)) { orig = ConfigurationManager.AppSettings["Dynamic"]; } HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", orig); }
原文地址:https://www.cnblogs.com/lxf1117/p/4253501.html