游览器同源策略,webapi无法跨域访问

同源策略:

概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准。它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载。
   这里的同源指的是:同协议,同域名和同端口。
精髓:
   它的精髓很简单:它认为自任何站点装载的信赖内容是不安全的。当被浏览器半信半疑的脚本运行在沙箱时,它们应该只被允许访问来自同一站点的资源,而不是那些来自其它站点可能怀有恶意的资源

Ajax应用:

在ajax应用中这种安全限制被突破

在普通的Javascript应用中,我们可以修改Frame的href,或者IFrame的src,以实现GET方式的跨域提交,但是却不能访问跨域的Frame/IFrame中的内容。

Ajax它通过XMLHTTP进行异步交互,这个对象同样能够与远程的服务器进行信息交互,而且更加危险的是,XMLHTTP是一个纯粹的Javascript对象,这样的交互过程,是在后台进行的,不被用户察觉。因此,XMLHTTP实际上已经突破了原有的Javascript的安全限制。

同源策略的存在,限制了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝。

 

“同源策略”限制了JavaScript的跨站点调用,这必然导致Web API不能垮域提供资源。

 

http://www.cnblogs.com/artech/p/cors-4-asp-net-web-api-01.html

 

 

 

---------------------代码

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class JSONPResult : JsonResult
    {
        public JSONPResult()
        {
            JsonRequestBehavior = JsonRequestBehavior.AllowGet;
        }
        public string Callback { get; set; }

        ///<summary>
        ///对操作结果进行处理
        ///</summary>
        ///<paramname="context"></param>
        public override void ExecuteResult(ControllerContext context)
        {
            var httpContext = context.HttpContext;
            var callBack = Callback;
            callBack = httpContext.Request["callback"]; //获得客户端提交的回调函数名称
            // 返回客户端定义的回调函数
            httpContext.Response.Write(callBack);

            httpContext.Response.Write("(" + Data);          //Data 是服务器返回的数据        

            httpContext.Response.Write(");");            //将函数输出给客户端,由客户端执行
        }
    }
}

using System.Web;
using System.Web.Mvc;

namespace MvcApplication1
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
    
    public class UserAuthorizeAttribute : AuthorizeAttribute
    {
        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            bool result = true;
            //return base.AuthorizeCore(httpContext);
            string[] users = Users.Split(',');
            string[] roles = Roles.Split(',');
            return result;
        }
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.HttpContext.Response.StatusCode == 403)
            {

            }
        }
    }
}

 

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class HomeController : ControllerBase
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View();
        }
        public ActionResult GetCompanyJson()
        {
            return new JSONPResult { Data = "{ID :'123', Name : 'asdsa' }" };
        }
    }
}

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Filters;

namespace MvcApplication1
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    public class CrossSiteAttribute : ActionFilterAttribute
    {
        private const string Origin = "Origin";
        private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        private const string originHeaderdefault = "*";
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin,originHeaderdefault);
        }
    }
}

 



using
MvcApplication1.Models; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace MvcApplication1.Controllers { public class WebApiController : ApiControllerBase { public IQueryable<SM_COMPANY> Get() { var db = new Entities(); return db.SM_COMPANY.AsQueryable(); } [HttpPost] public List<SM_COMPANY> GetComapny() { var db = new Entities(); return db.SM_COMPANY.ToList(); } [HttpGet] public SM_COMPANY GetCompany(string companyCode) { using (var db = new Entities()) { return db.SM_COMPANY.Where(a => a.SCOMPANYCODE == companyCode).SingleOrDefault(); } } } }

 

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <script src="Scripts/jquery-1.10.2.min.js"></script>
    <script type="text/javascript">
        function listCompany(result) {
            alert('t');
        }
        $(function () {
            $.ajax({
                url: "http://192.168.122.174:8051/api/WebApi",
                dataType: "json",
                type:"get",
                success: function (d) {
                    var html = "<ul>";
                    $("#div1").html("");
                    $.each(d, function () {
                        html += "<li>"+this.SSHORTNAME+"</li>"+
                                "<li>" + this.SCOMPANYCODE + "</li>";
                    })
                    html += "</ul>";
                    $("#div1").append(html);
                },
                error: function (err) {
                    alert(err);
                }
            })
            $.ajax({
                type: "get",
                //url: "http://192.168.122.174:8051/api/WebApi/GetCompanyJson?companyCode=10000000&callback=listCompany",
                //url: "http://192.168.122.174:8051/Home/GetCompanyJson?callback=?",
                url: "http://192.168.122.174:8051/Home/GetCompanyJson",
                dataType: "jsonp",
                success: function (data) {
                    alert("ss");
                },
                error: function (err) {
                    alert(err);
                }
            })
        })
        
        
    </script>
    <!--<script type="text/javascript" src="http://192.168.122.174:8051/api/WebApi?callback=listCompany&companyCode=10000000"></script>-->
</head>
<body>
    <input type="button" value="btn" id="btn"/>
    <div id="div1"></div>
</body>
</html>

 

posted @ 2015-10-30 13:38  wjl910  阅读(387)  评论(0)    收藏  举报