游览器同源策略,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>

浙公网安备 33010602011771号