首页 > 编程语言 >C# httpclient获取cookies实现模拟web登录

C# httpclient获取cookies实现模拟web登录

时间:2023-07-09 10:46:03浏览次数:44  
标签:web cookies 登录 C# var response httpClient

目前在公司做一款平台化的产品,我主要负责PC端上的开发,在产品推荐过程中为了节省开发时间很多功能模块没来得及做原生,用CEF嵌入了很多带功能web页面,与客户端进行交互从而实现功能。

在二期开发中,产品需求说明书中需要把登录功能放在客户端来做,这当中涉及到一个问题客户端做登入登出很简单,但是很难通知到web平台登入登出。

我的想法是通过动态get/set浏览器cookies+refresh浏览器来实现平台登录。

web端登录本身是相同URL在不同环境下(cookies/session两种)有不通的相应规则。

下面我来阐述做法

通过System.Net.Http中httpclient类调用接口实现客户端登录。

  1.   // 创建请求
  2.   HttpClient httpClient = new HttpClient();
  3.   httpClient.Timeout = TimeSpan.FromSeconds(10);
  4.   string url = ConfigHelper.WebServerUrl + "p/user/Autologin";
  5.   var response = await httpClient.PostAsync(url, this.GetPostParameter());
  6.   // 请求失败
  7.   if (!response.IsSuccessStatusCode)
  8.   {
  9.   return null;
  10.   }
  11.   //这句话是关键点
  12.   var cookies = response.Headers.GetValues("Set-Cookie");
  13.   // 解析请求结果
  14.   string content = await response.Content.ReadAsStringAsync();

在response中会带有cookies信息包括JSESSIONID和GSID。.Net中HttpCilent比较老旧没有解析header的方法,不如Java全面。需要人工解析。

在返回值成功后,客户端即应该已经算作登录状态了。但web页面并不知道我们登没登陆。

之后与web页面的接口交互,如果是登录后的接口需要携带session信息。有如下两种方法:

  1.   // 创建请求
  2.   //将刚才的cookies放入cookiescontainer并加入初始化
  3.   var handler = new HttpClientHandler() { CookieContainer = cookiescontainer, AllowAutoRedirect = true, UseCookies = true };
  4.    
  5.   HttpClient httpClient = new HttpClient(handler);
  6.   httpClient.Timeout = TimeSpan.FromSeconds(10);
  7.    
  8.   string url = ConfigHelper.WebServerUrl + "p/user/activeUser";
  9.   var response = await httpClient.PostAsync(url, this.GetUpdatePostParameter());

或者 通过手写cookies的方式也行
  1.   string JSESSIONID =“123456”;
  2.   string GSID=“456789”;
  3.   var handler = new HttpClientHandler() { UseCookies = false }; //手写cookies
  4.   HttpClient httpClient = new HttpClient(handler);
  5.   httpClient.Timeout = TimeSpan.FromSeconds(10);
  6.   string url = ConfigHelper.WebServerUrl + "p/user/activeUser";
  7.    
  8.   var message = new HttpRequestMessage(HttpMethod.Post, url);
  9.   message.Content = this.GetUpdatePostParameter();
  10.   var cookie = "JSESSIONID" + "=" + JSESSIONID + ";" + "GSID" + "=" + GSID;
  11.   message.Headers.Add("Cookie", cookie);
  12.    
  13.   var response = await httpClient.SendAsync(message);

这样可以模拟web页面登陆后与其内部接口相交互。

还有一半功能需要注意,在CEF中进行页面跳转时,由于登录不是通过web页面本身进行的,而是客户端主动请求的,这样浏览器并不知道用户是否成功登录,我们还需要对浏览器cookies进行配置。

  1.   var manager = CefCookieManager.GetGlobal(null);
  2.   //在这个manager中,有对cefcookies进行添加删除刷新等操作

这样就基本实现了在客户端模拟web登录

标签:web,cookies,登录,C#,var,response,httpClient
From: https://www.cnblogs.com/yidanda888/p/17538403.html

相关文章

  • 【HDC.Cloud 2023】新鲜速递:从多元生态、开源到人才培养,让开发者成为决定性力量
    摘要:华为云开发者联盟邀您一起回顾大会精彩时刻。本文分享自华为云社区《【HDC.Cloud2023】新鲜速递:从多元生态、开源到人才培养,让开发者成为决定性力量》,作者:华为云社区精选。华为开发者大会2023(Cloud)7月7日在中国东莞正式揭开帷幕,邀请全球开发者共聚一堂,就AI浪潮之下的产业......
  • CLR组件开发之 基于C++ dll 与C++/CLI dll与C#的数据类型对应关系
    ​  模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导......
  • 基于MFC dll实现C++/CLI dll组件全过程详解(附完整源码) 浮云绘图
    ​模块化组件化实现独立的功能模块是软件设计的良好习惯,一般用实现为DLL。普通的DLL对外提供接口是采用导出函数接口,如果接口数量不大,只是50个以内,这种方式很适合;如果对外接口有上百个,导出函数接口就完全破坏了软件模块化分层设计的理念,使用接口非常麻烦,此情形采用C++/CLI导出类......
  • [PowerShell]设置笔记本亮度 -- CIM cmdlet
    如下:$monitor=Get-CimInstance-Namespaceroot/WMI-ClassNameWmiMonitorBrightnessMethodsInvoke-CimMethod-InputObject$monitor-MethodNamewmisetBrightness-Arguments@{Timeout='10';Brightness='25'}参考https://learn.microsoft.com......
  • 【论文解析】EJOR 2011 A clustering procedure for reducing the number of represen
    论文名称:AclusteringprocedureforreducingthenumberofrepresentativesolutionsintheParetoFrontofmultiobjectiveoptimizationproblems动机假设一个三目标优化问题\[\begin{aligned}&\text{Availability:}\max_\thetaJ_1(\theta)=\max_{\theta_p,......
  • docker中测试Address Sanitizer
    原文地址:https://www.cnblogs.com/liqinglucky/p/address-sanitizer-in-docker.htmlDocker只是提供了一个运行环境,Docker里的程序集成AddressSanitizer与Linux环境编译相比并不需要做任何额外改动。源代码:liqinglucky/DockerHelloWorld-码云-开源中国(gitee.com)一、代码......
  • 透明信息提示框CFyToolTip设计及源码 适用于各类绘图的实时信息展示
    在图形绘制领域,经常需要用到透明的信息提示窗口,比如当鼠标移动到一个图元上,显示该图元对象的实时数据(如设备名称、状态、实测数据等),当鼠标移开,及时隐藏该提示框;比如在曲线控件绘图时,随着鼠标移动,实时展示曲线对应的横纵坐标值等​ 各种通用开发库里,也有类似的控件,如C#WinFor......
  • ECMAScript 2023 正式发布,有哪些新特性?
    从头到尾搜索数组:findLast()、findLastIndex()从末尾开始搜索 ......
  • CS823 智能代理
    CS823–ReasoningforIntelligentAgentsComputerandInformationSciencesUniversityofStrathclydeCreatedJune2023ByDrAndrewAbelReditAssignment–PDDLBuilding–Worth100%ofOverallMarkThereare3partstothisassignment,anon-temporalmodel,a......
  • 通用的CRUD之MongoDB
    前言这是一个简便的,对MongoDB增删改查,无需提前建库,建表,安装就能快速上手使用。MongoDB多条件查询需要JSON的多层嵌套如{DDATE:{$gte:{$date:'2023-06-05T13:41'},$lte:{$date:'2023-06-05T23:59'}},Qty:{$gt:10}},书写时非常难受,还容易出错。本类库支持类SQL查询语法,如"DDATE>......