webapi跨域使用session的方法示例
在之前的項目中,我們設置跨域都是直接在web.config中設置的。
這樣是可以實現(xiàn)跨域訪問的。因為我們這邊一般情況下一個webapi會有多個網(wǎng)站、小程序、微信公眾號等訪問,所以這樣設置是沒有問題的。但是……如果其中一個網(wǎng)站需要用到cookie或者session的時候,
Access-Control-Allow-Origin如果還是設置成“*”就會報錯,當然是前端報錯。。。數(shù)據(jù)返回還有cookie/session都還是能存,但是報錯就不爽了啊。
于是,想著整改一下。
先上前端代碼。來個頁面遠程ajax請求去設置session。啥都沒有,就是點按鈕,發(fā)個請求。標記地方是必須加的
@{ ViewBag.Title = "TestSetSession"; } <h2>TestSetSession</h2> <button onclick="Set()">設置session</button> @section scripts{ <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script> function Set() { $.ajax({ url: "http://localhost:1338/api/Test/SetSession?session=1234567fdsdfghjhgfds", dataType: "json", xhrFields: { withCredentials: true }, crossDomain: true, data: {}, type: "post", success: function (data) { alert(data.message) }, error: function () { alert('服務器發(fā)生錯誤!'); } }); } </script> }
然后再來個頁面,獲取上個頁面設置的session。
@{ ViewBag.Title = "TestGetSession"; } <h2>TestGetSession</h2> <button onclick="Get()">獲取session</button> @section scripts{ <script src="~/Scripts/jquery-1.10.2.min.js"></script> <script> function Get() { $.ajax({ url: "http://localhost:1338/api/Test/GetSession", dataType: "json", xhrFields: { withCredentials: true }, crossDomain: true, data: {}, type: "get", success: function (data) { alert("session:" + data.data.session_state + ",cookie:" + data.data.cookie); }, error: function () { alert('服務器發(fā)生錯誤!'); } }); } </script> }
后臺代碼
1.先允許webapi使用session
在global中加入如下代碼
public override void Init() { PostAuthenticateRequest += MvcApplication_PostAuthenticateRequest; base.Init(); } void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e) { System.Web.HttpContext.Current.SetSessionStateBehavior( System.Web.SessionState.SessionStateBehavior.Required); }
2.允許跨域。我這里使用的是Microsoft.AspNet.WebApi.Cors
先安裝包,然后在WebApiConfig中加入如下代碼。等同于在web.config中設置
//允許跨域 config.EnableCors(new EnableCorsAttribute("*", "*", "*"));
在請求方法上打上[EnableCors]標簽,特指某一些域名的訪問需要cookie/session
[EnableCors("http://localhost:6477,http://localhost:6478", "*","*")] public class TestController : ApiController { /// <summary> /// 設置session /// </summary> /// <returns></returns> public dynamic SetSession(string session) { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); //緩存state HttpContext.Current.Session["session_test"] = session; HttpCookie cookie = new HttpCookie("cookie_test") { Value = session, Expires = DateTime.Now.AddHours(1) }; HttpContext.Current.Response.Cookies.Add(cookie); return new { success = true, message = "設置session" }; } /// <summary> /// 獲取session /// </summary> /// <returns></returns> public dynamic GetSession() { HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); var session = HttpContext.Current.Session["session_test"]; HttpCookie _cookie = HttpContext.Current.Request.Cookies["cookie_test"]; var cookie = _cookie?.Value??""; string session_state = session == null ? "" : session.ToString(); return new { success = true, message = "獲取session", data = new { session_state, cookie } }; }
結果:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Asp.Net 動態(tài)頁面轉(zhuǎn)靜態(tài)頁面主要代碼
關于在Asp.Net中動態(tài)頁面轉(zhuǎn)靜態(tài)頁面的方法網(wǎng)上比較多。結合實際的需求,我在網(wǎng)上找了一些源代碼,并作修改。現(xiàn)在把修改后的代碼以及說明寫一下。2009-12-12ajaxToolkit:ModalPopupExtender演示及實現(xiàn)代碼
ajaxToolkit:ModalPopupExtender可以讓用戶模擬新開一個窗口,就是在模擬新開窗口作多項選項的功能,感興趣的朋友可以了解下,希望此文對你有所幫助2013-01-01asp.net+jquery Gridview的多行拖放, 以及跨控件拖放
學習JQuery時,發(fā)現(xiàn)JQuery只能做單行拖放, 于是花時間做了一個多行拖放的例子, 以備以后使用。2009-11-11