C# httpclient获取cookies实现模拟web登录
目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能。
在二期开发中,产品需求说明书中需要把登录功能放在客户端来做,这当中涉及到一个问题客户端做登入登出很简单,但是很难通知到web平台登入登出。
我的想法是通过动态get/set浏览器cookies+refresh浏览器来实现平台登录。
web端登录本身是相同URL在不同环境下(cookies/session两种)有不通的相应规则。
下面我来阐述做法
通过System.Net.Http中httpclient类调用接口实现客户端登录。
-
// 创建请求
-
HttpClient httpClient = new HttpClient();
-
httpClient.Timeout = TimeSpan.FromSeconds(10);
-
string url = ConfigHelper.WebServerUrl + "p/user/Autologin";
-
var response = await httpClient.PostAsync(url, this.GetPostParameter());
-
// 请求失败
-
if (!response.IsSuccessStatusCode)
-
{
-
return null;
-
}
-
//这句话是关键点
-
var cookies = response.Headers.GetValues("Set-Cookie");
-
// 解析请求结果
-
string content = await response.Content.ReadAsStringAsync();
在response中会带有cookies信息包括JSESSIONID和GSID。.Net中HttpCilent比较老旧没有解析header的方法,不如Java全面。需要人工解析。
在返回值成功后,客户端即应该已经算作登录状态了。但web页面并不知道我们登没登陆。
之后与web页面的接口交互,如果是登录后的接口需要携带session信息。有如下两种方法:
-
// 创建请求
-
//将刚才的cookies放入cookiescontainer并加入初始化
-
var handler = new HttpClientHandler() { CookieContainer = cookiescontainer, AllowAutoRedirect = true, UseCookies = true };
-
-
HttpClient httpClient = new HttpClient(handler);
-
httpClient.Timeout = TimeSpan.FromSeconds(10);
-
-
string url = ConfigHelper.WebServerUrl + "p/user/activeUser";
-
var response = await httpClient.PostAsync(url, this.GetUpdatePostParameter());
或者 通过手写cookies的方式也行
-
string JSESSIONID =“123456”;
-
string GSID=“456789”;
-
var handler = new HttpClientHandler() { UseCookies = false }; //手写cookies
-
HttpClient httpClient = new HttpClient(handler);
-
httpClient.Timeout = TimeSpan.FromSeconds(10);
-
string url = ConfigHelper.WebServerUrl + "p/user/activeUser";
-
-
var message = new HttpRequestMessage(HttpMethod.Post, url);
-
message.Content = this.GetUpdatePostParameter();
-
var cookie = "JSESSIONID" + "=" + JSESSIONID + ";" + "GSID" + "=" + GSID;
-
message.Headers.Add("Cookie", cookie);
-
-
var response = await httpClient.SendAsync(message);
这样可以模拟web页面登陆后与其内部接口相交互。
还有一半功能需要注意,在CEF中进行页面跳转时,由于登录不是通过web页面本身进行的,而是客户端主动请求的,这样浏览器并不知道用户是否成功登录,我们还需要对浏览器cookies进行配置。
-
var manager = CefCookieManager.GetGlobal(null);
-
//在这个manager中,有对cefcookies进行添加删除刷新等操作
这样就基本实现了在客户端模拟web登录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现