视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
webapi跨域使用session的方法示例
2020-11-27 22:34:58 责编:小采
文档


在之前的项目中,我们设置跨域都是直接在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:77,http://localhost:78", "*","*")]
 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 }
 };
 }

结果:

下载本文
显示全文
专题