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
Winform使用CefSharp和HttpWebRequest如何保持会话Session的更多相关文章
- C#检测并安装https站点的数字证书,CefSharp和HttpWebRequest通过会话Cookie实现自动登录访问https站点
HttpUtil工具类: using System; using System.Collections.Generic; using System.IO; using System.Linq; usi ...
- Winform下CefSharp的引用、配置、实例与报错排除(源码)
Winform下CefSharp的引用.配置.实例与报错排除 本文详细介绍了CefSharp在vs2013..net4.0环境下,创建Winfrom项目.引用CefSharp的方法,演示了winfro ...
- 简单PHP会话(session)说明
现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...
- http 会话(session)详解
会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...
- Tensorflow会话Session
转载自: http://blog.csdn.net/Hanging_Gardens/article/details/72784392 https://www.cnblogs.com/hypnus-ly ...
- 网络基础 http 会话(session)详解
http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...
- Java通过遍历sessionId获取服务器所有会话session
Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...
- jfc在jsp页面画图,不将图片存在服务器端,只存入会话session(可用)
jfc在jsp页面画图,不将图片存在服务器端,只存入会话session.其中主要用到jfc的一个servlet类. <%@ page contentType="text/html;ch ...
- Oracle数据库的连接模式connection Mode、连接connection与会话session
数据库的连接模式Connection Mode: Dedicated Server Mode(专有模式) 当用户发出请求时,如远程的client端通过监听器连接数据库上,ORACLE的服务器端会启用一 ...
- MyBatis之会话Session原理
MyBatis 之会话 Session 执行逻辑 1.SQL 会话工厂构建器类 SqlSessionFactoryBuilder 的 build 方法用于构建 SqlSessionFactory 类的 ...
随机推荐
- el-dialog 遮罩层覆盖内容的问题
页面组件层级太多,就会出现遮罩层覆盖dialog里面内容的问题 解决: :append-to-body="true" 把遮罩层添加到body上面 用z-index 设置没效 ...
- Neo4j插件安装
Neo4j插件安装 Author:wss Date:2022.6.9 Topic:Neo4j插件安装 一.前言 昨天再次安装Apoc插件,又去找之前看的教程,有些地方不够清晰要几个教程对比着看,想到可 ...
- .net5 winform 打开文件夹
直接使用System.Diagnostics.Process.Start("路径"),有可能会包拒绝访问的异常,建议采用以下写法: var newPath="" ...
- js提取字符串开头公共部分
需求: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 思路:记录数组中第一个字符串的每个字符,依次判断数组中的每个字符串是否都有这个字符 ...
- Fast Report 分栏分页
Layout 设置布局 AcrossThenDown是水平分栏 DownThenAcross是垂直分栏
- winform 中 label透明化
label1.BackColor = Color.Transparent;//设置背景颜色为透明 label1.Parent = pictureBox1;//将pictureBox1设为标签的父控件, ...
- LogAgent —— etcd+kafka+zookeeper+go实现实时读取日志发送到kafka,并实现热加载配置读取的日志路径
工具包目录结构: .├── conf│ ├── logAgent.ini│ └── logAgentConfig.go├── etcd│ └── etcd.go├── kafka│ └ ...
- 【Java】取n工作日后的日期(仅排除周六周日)
import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java. ...
- HANDLE和HMOUDLE、HWND讲解
HWND是线程相关的,通常指明窗口句柄,通过句柄找到窗口所属进程和线程 Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄.系统对内核对象以链表的形式进行管理,载入到内存中的每一个内核 ...
- CentOS 7安装配置vsftp并搭建FTP(一)
vsftp-VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件.关于这个软件的详细信息 大家可以自行百度. 以上自己安装vsftp系统环境 二.查看自己的服务器是否安装了vsftp ...