• 跨域请求


    限制跨域访问是一种浏览器端安全限制,服务端不存在跨域一说,这里介绍跨域实现方式,我用的是asp.net webapi。

    原生跨域实现

    服务端返回字符串:callback('hello')
    前端:

    	$(function(){
    		$.ajax({
    			url: 'http://localhost:27656/api/Values/getStr',
    			type: 'get',
    			dataType: 'jsonp',
    			jsonp:'callback'
    		});
    	});
    	function callback (result) {
    		alert(result);
    	}
    

    CORS

    服务端中接口如下,即返回一个string数组

    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
    

    客户端中js如下

    <script type="text/javascript">
        $(function () {
            $.ajax({
                type: "get",
                dataType: "json",
                url: "http://localhost:2700/api/Values",
                data: {},
                success: function (data, status) {
                    alert(data);
                },
                error: function (e) {
                    alert(JSON.stringify(e));
                },
                complete: function () {
                }
            });
        });
    </script>
    

    启动服务端,客户端访问没有得到服务端返回的数组,并且浏览器报了个错

    配置服务端支持CORS跨域

    • 使用NUGET引用microsoft.aspnet.webapi.cors
    • WebApiConfig中添加配置:config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
      再次访问客户端,跨域成功

    Jsonp

    服务端中接口上面一样
    客户端中js如下,唯一的区别就是dataType:"jsonp"

    <script type="text/javascript">
        $(function () {
            $.ajax({
                type: "get",
                dataType: "jsonp",
                url: "http://localhost:2701/api/Values",
                data: {},
                success: function (data, status) {
                    alert(data);
                },
                error: function (e) {
                    alert(JSON.stringify(e));
                },
                complete: function () {
                }
            });
        });
    </script>
    

    配置服务端支持jsonp跨域

    • 使用NUGET引用WebApiContrib.Formatting.Jsonp
    • WebApiConfig中添加配置:GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
      此时再访问客户端,跨域成功

    需要注意的是,jsonp方式仅支持get类型的接口,这是由jsonp的实现机制决定的,jsonp实际上是利用script标签实现的跨域;一般是动态向页面head中添加此script标签,如:<script src='http://localhost:9090/student?callback=showData'></script>,其中showData是回调方法名,前端把showData这个名字传给后端,后端拼接一个类似showData(data)脚本传给前端,data即是后端返回的数据,而此时showData可以立即执行;而在前端我们已经预先定义好showData方法;其实实际应用中不需要这么麻烦,使用以上的jquery ajax实现跨域比较方便。

  • 相关阅读:
    Python字符串转码问题
    tcpip详解笔记(21) TCP的路径MTU探测与长肥管道
    sync,fsync,fdatasync,fflush
    tcpip详解笔记(22) telnet协议
    tcpip详解笔记(18)TCP的超时与重传
    tcpip详解笔记(16) TCP的交互数据流
    Get exception description and stack trace which caused an exception
    tcpip详解笔记(20) TCP的Keepalive定时器
    [转]应该知道的Linux技巧
    How to prettyprint JSON script?
  • 原文地址:https://www.cnblogs.com/yinchh/p/10572408.html
Copyright © 2020-2023  润新知