欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

webapi跨域使用session的方法示例

程序员文章站 2022-05-14 23:16:47
在之前的项目中,我们设置跨域都是直接在web.config中设置的。 这样是可以实现跨域访问的。因为我们这边一般情况下一个webapi会有多个网站、小程序、微信公众号...

在之前的项目中,我们设置跨域都是直接在web.config中设置的。

webapi跨域使用session的方法示例

这样是可以实现跨域访问的。因为我们这边一般情况下一个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 }
      };
    }

结果:

webapi跨域使用session的方法示例

webapi跨域使用session的方法示例

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。