之前我们使用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,所以希望打开新页面,而不是给我打开心浏览器窗体。
————————————————
版权声明:本文为CSDN博主「b哈利路亚d」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lanwilliam/article/details/79640597

Winform使用CefSharp和HttpWebRequest如何保持会话Session的更多相关文章

  1. C#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点

    HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...

  2. Winform下CefSharp的引用、配置、实例与报错排除(源码)

    Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...

  3. 简单PHP会话(session)说明

    现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...

  4. http 会话(session)详解

    会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...

  5. Tensorflow会话Session

    转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...

  6. 网络基础 http 会话(session)详解

    http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...

  7. Java通过遍历sessionId获取服务器所有会话session

    Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...

  8. jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)

    jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...

  9. Oracle数据库的连接模式connection Mode、连接connection与会话session

    数据库的连接模式Connection Mode: Dedicated Server Mode(专有模式) 当用户发出请求时,如远程的client端通过监听器连接数据库上,ORACLE的服务器端会启用一 ...

  10. MyBatis之会话Session原理

    MyBatis 之会话 Session 执行逻辑 1.SQL 会话工厂构建器类 SqlSessionFactoryBuilder 的 build 方法用于构建 SqlSessionFactory 类的 ...

随机推荐

  1. 堆相关题目-python

    栈&队列&哈希表&堆-python  https://blog.csdn.net/qq_19446965/article/details/102982047 1.丑数 II 编 ...

  2. shell实现接口初次失败告警,恢复也发送一次通知

    1.该shell判断 第一次失败告警,接口恢复发送一次通知 参数:一个参数接口返回结果0 表示成功 1表示失败 脚本详情 [root@localhost bd]# more bd-new.sh #!/ ...

  3. git提交到代码到远程仓库,合并分支提示entirely different commit histories(备忘)

    最近提交代码到github,合并分支的时候提示"master and main are entirely different commit histories" master为本地 ...

  4. git常规操作

    git拉代码 使用git clone命令从仓库下载代码,代码下载到了本地:git clone 链接 如果仓库代码又了更新,这时可以使用git pull命令将更新下载到本地 在对本地代码就行修改后,可以 ...

  5. 2022-05-12内部群每日三题-清辉PMP

    1.项目团队成员将因积极工作和满足项目成本目标而获得奖励.高级经理向项目经理询问团队成员的可用性和旅行偏好,项目经理可以在哪里获得奖励的定义标准和频率? A.责任分配矩阵(RAM) B.项目管理计划 ...

  6. vue项目,本地启动时,请求地址会自动加上http://localhost:

    wepack设置时,使用代理 devServer: { hot: true, host: '0.0.0.0', port: "2023", // 项目启动端口, 默认8080 // ...

  7. Kubernetes 安装网络插件(calico)

    简介 Calico是Kubernetes生态系统中另一种流行的网络选择.虽然Flannel被公认为是最简单的选择,但Calico以其性能.灵活性而闻名.Calico的功能更为全面,不仅提供主机和pod ...

  8. Python中Websocket的实现及基本原理

    一.什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务 ...

  9. VUE如何创建一个项目

    1.安装 Vite npm install -g create-vite-app 2.利用 Vite 安装 Vue3.0 项目 create-vite-app projectName 3.安装依赖运行 ...

  10. IDEA Download missing driver files 下载失败解决方法

    使用IDEA连接数据库时可能会遇到缺失驱动文件的问题(提示Download missing driver files) 正常情况下点击Download后IDEA会自动下载缺失的文件,但是因为网络原因, ...