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,所以希望打开新页面,而不是给我打开心浏览器窗体。
————————————————
版权声明:本文为CSDN博主「b哈利路亚d」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lanwilliam/article/details/79640597
最新文章
- 原生JS获取元素集合的子元素宽度
- python Windows下的android设备截图工具
- Encoding
- DIV CSS阴影
- linux下获取硬盘、内存、U盘大小及使用大小
- Oracle where 0=1 or 1=1
- git stash暂存文件
- Java Mybatis实现主从同步
- devC++代码格式化对齐的快捷键
- 集成学习(ensemble learning)
- flex中使用white-space
- Update openssh7.9 on centos6
- crontab定时时间解释
- 数据库路由中间件MyCat - 源代码篇(7)
- 黄聪:实用WordPress SQL查询方法
- spring StopWatch用法
- WPF中各个Template的分析(转)
- Flume+Morphlines实现数据的实时ETL
- 迁移数据到历史表SQL(转)
- django的ORM中的2个易混点
热门文章
- 金蝶AAS-V9精简版使用手册1.6
- Tkinter模块的使用【转】
- js 判断条件分支优化
- C语言中关于宏定义的学习
- 浅谈flume
- QT debug/moc_frmalarminfo.o:(.data.rel.ro._ZTV12FrmAlarmInfo[_ZTV12FrmAlarmInfo]+0x1c0): undefined reference to `non-virtual thunk to FrmAlarmInfo::~FrmAlarmInfo()&#39;解决方法
- 解决GitHub下载速度慢下载失败的问题
- gitlab 已有代码仓库推送到另外一个gitlab仓库
- VS+QT创建的项目 UI界面更新控件,代码里识别不到
- SpringBoot-集成PageHelper及使用