C# httpclient获取cookies实现模拟web登录
2023-09-11 14:21:56 时间
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登录
相关文章
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
- c# 中内部类的简单介绍 C#内部类
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
- 请求大神,C#如何截取字符串中指定字符之间的部分 按指定字符串分割 一分为二 c# 去除字符串中的某个已知字符
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
- js_html_input中autocomplete="off"在chrom中失效的解决办法 使用JS模拟锚点跳转 js如何获取url参数 C#模拟httpwebrequest请求_向服务器模拟cookie发送 实习期学到的技术(一) LinqPad的变量比较功能 ASP.NET EF 使用LinqPad 快速学习Linq
- 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式
- C# IL DASM 使用-破解c#软件方法
- c# .net 模拟请求 POST, Get,Put,Delete,并带Headers,BUF加持异步多线程执行
- C#【多线程篇】模拟网络通信定时心跳检测连接状态(AutoResetEvent)
- c#解析json字符串处理清晰易懂的方法
- C# ProgressBar用法:模拟进度条
- C# ZIP解压缩 模拟时钟
- C#中线程的委托
- c# 将html添加进剪贴板(带格式)
- 《C#零基础入门之百识百例》(九十二)本地数据交互 -- 文件概述 -- File类介绍和使用
- Unity 之 Lua模拟C#等一个协程执行
- C# 数组基础
- C# Monitor:锁定资源
- C# IO流的操作(二)
- 接口 C# 请求数据 模拟多线程下载文件
- 接口 C# 请求数据 使用post的方式提交raw格式的数据,数据为json格式,多层嵌套
- c#类的定义,c#中的关健字,C#标识符