Winform使用CefSharp和HttpWebRequest如何保持会话Session

之前我们使用CefSharp,在Winform中,使用ChromiumWebBrowser加载了web项目的页面。

并且通过html页面的js调用了本地的窗口。

那么下一个问题来了。

为了保障系统安全性,项目都会使用session会话来进行权限认证。

那么,我在新打开的winform窗体中,肯定是要获取数据并且进行交互操作的。也就是说要用到HttpWebRequest。

然后HttpWebRequest肯定会产生新的session,然后通不过后台验证。这时候怎么办呢。

有经验的都知道,服务器(iis或者tomcat,apache2,nigx)都是通过请求中的sessionid来判断是否是相同会话的。当然,不同服务器的sessionid的名称有区别,这个无关紧要。重要的是,sessionid都是存在cookie中进行保存的。毕竟服务器处理每条请求的时候,都是新建页面对象进行处理。所以请求都是短连接,只能通过这种机制来进行。

那么问题改变方向了,如何把cookie从ChromiumWebBrowser中读取出来,然后再HttpWebRequest中发送过去呢?

CefSharp肯定是提供了方法的。

首先实现一个Cookie读取操作的接口,CefSharp.ICookieVisitor,实例化Visit方法。这个方法会返回Cookie对象,当然是CefSharp的Cookie对象,不是System.net的,要注意类型。这里面开放了一个SendCookie的代理,用来开放Cookie。

    public class CookieVisitor : CefSharp.ICookieVisitor
    {
        public event Action<CefSharp.Cookie> SendCookie;

        public void Dispose()
        {
            //throw new NotImplementedException();
        }

        public bool Visit(CefSharp.Cookie cookie, int count, int total, ref bool deleteCookie)
        {
            deleteCookie = false;
            if (SendCookie != null)
            {
                SendCookie(cookie);
            }

            return true;
        }
    }
然后再Form窗体中实现如下事件。这个时间会在页面加载完毕时触发,在页面中绑定SendCookie事件实现。
        private void browser_FrameLoadEnd(object sender, CefSharp.FrameLoadEndEventArgs e)
        {
            var cookieManager = CefSharp.Cef.GetGlobalCookieManager();

            CookieVisitor visitor = new CookieVisitor();
            visitor.SendCookie += visitor_SendCookie;
            cookieManager.VisitAllCookies(visitor);
        }
        public static string cookies;
        private void visitor_SendCookie(CefSharp.Cookie obj)
        {
            cookies += obj.Domain.TrimStart('.') + "^" + obj.Name + "^" + obj.Value + "$";
        }

这上面是直接定义了存储Cookie的字符串,然后把CefSharp给的Cookie存下来了。只存了几个关键属性,用字符分割了一下。 重点只是演示。其实是可以直接转换成System.Net.Cookie对象存储的。后面会用到。建议调试过程中Debug看一下。

        public static CookieCollection GetCookieCollection()
        {
            CookieCollection cookieCollection = new CookieCollection();
            string[] arr = cookies.Split('$');
            foreach(string s in arr)
            {
                if (string.IsNullOrEmpty(s))
                    continue;
                string[] car = s.Split('^');
                System.Net.Cookie cookie = new System.Net.Cookie();
                cookie.Domain = car[0];
                cookie.Name = car[1];
                cookie.Value = car[2];
                cookieCollection.Add(cookie);
            }
            return cookieCollection;
        } 

然后就是上面这段了。在使用HttpWebRequest的时候,会用到CookieCollection来设置Cookie,这里做下解析转换。

生下的就简单了,在HttpWebRequest初始化的时候,

request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(GetCookieCollection());

这样搞一下就好了。

然后就能实现,使用与Browser中同一Session了,不用单独在处理login了,也不用传什么登录用户什么的了。一劳永逸。

接下来说一下,怎么处理html中 “_blank”的问题吧。我这里用的是tabCtrl,所以希望打开新页面,而不是给我打开心浏览器窗体。


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值