webapi跨域使用session的方法示例
程序员文章站
2022-05-14 23:16:47
在之前的项目中,我们设置跨域都是直接在web.config中设置的。
这样是可以实现跨域访问的。因为我们这边一般情况下一个webapi会有多个网站、小程序、微信公众号...
在之前的项目中,我们设置跨域都是直接在web.config中设置的。
这样是可以实现跨域访问的。因为我们这边一般情况下一个webapi会有多个网站、小程序、微信公众号等访问,所以这样设置是没有问题的。但是……如果其中一个网站需要用到cookie或者session的时候,
access-control-allow-origin如果还是设置成“*”就会报错,当然是前端报错。。。数据返回还有cookie/session都还是能存,但是报错就不爽了啊。
于是,想着整改一下。
先上前端代码。来个页面远程ajax请求去设置session。啥都没有,就是点按钮,发个请求。标记地方是必须加的
@{ 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('服务器发生错误!'); } }); } </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('服务器发生错误!'); } }); } </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 } }; }
结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 微信小程序实现复选框效果
下一篇: 微信小程序自定义可滑动日历界面