WebApi系列~開放(fang)的CORS,跨域資(zi)源訪問對所有(you)人開放(fang)
之前有(you)(you)(you)客戶問我(wo),如何AJAX跨域post,這個問題(ti)挺有(you)(you)(you)意思,在我(wo)們看來,我(wo)是(shi)(shi)不被(bei)(bei)允許的(de)(de),因為它(ta)是(shi)(shi)不安全的(de)(de),但(dan)隨著web api的(de)(de)火熱,這個東西也被(bei)(bei)人(ren)們一步步的(de)(de)接受了,確(que)實(shi),有(you)(you)(you)時,我(wo)們的(de)(de)接口希望對所有(you)(you)(you)人(ren)公開,它(ta)并不在乎有(you)(you)(you)人(ren)惡(e)意去POST灌(guan)數據,呵呵!
實現思(si)路(lu):向HTTP請求頭添加(jia)跨域(yu)標識Access-Control-Allow-Origin,將它的(de)值設為*即可(ke),當然如果你一個個頁(ye)面去加(jia)那就太麻煩了(le),也不推(tui)薦,有一天老總感覺這是不安全的(de)了(le),讓你去掉它,只(zhi)你可(ke)就麻煩大了(le),哈哈,所(suo)以,還有找個全局點吧!
開放的CORS過(guo)濾器,只對類開放,不支持方法(fa)單獨設置
/// <summary> /// 開放(fang)cors協(xie)議,支持(chi)跨域訪(fang)問 /// </summary> [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)] public class OpenCorsAttribute : ActionFilterAttribute { /// <summary> /// 開(kai)放cors協議,支持跨域訪問的初始化 /// </summary> public OpenCorsAttribute() { } /// <summary> ///在action渲(xuan)染之前 /// </summary> /// <param name="filterContext"></param> public override void OnActionExecuting(ActionExecutingContext filterContext) { var responseHead = filterContext.RequestContext.HttpContext.Response.Headers; if (responseHead != null) { responseHead.Add("Access-Control-Allow-Origin", "*"); } base.OnActionExecuting(filterContext); } }
使用它也非常簡單
[OpenCorsAttribute] public class HomeController : AsyncController {
}
而如果希望所有(you)控制(zhi)器(qi)都添加這(zhe)個特性(xing),可以在(zai)FilterConfig類中去添加全局過濾器(qi)
public static void RegisterGlobalFilters(GlobalFilterCollection filters) { filters.Add(new OpenCorsAttribute()); filters.Add(new GlobalErrorAttribute()); filters.Add(new HandleErrorAttribute()); filters.Add(new UrlRuleFilterAttribute()); }
這樣,你所有的Action也被破加上了這個特性,當然,如果你手動向Action上這是不被允許的,因為我們設置了AttributeUsage(AttributeTargets.Class),呵呵
程序截圖