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

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

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

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

下面我来阐述做法

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

 // 创建请求
HttpClient httpClient = new HttpClient();
httpClient.Timeout = TimeSpan.FromSeconds();
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(); string url = ConfigHelper.WebServerUrl + "p/user/activeUser";
var response = await httpClient.PostAsync(url, this.GetUpdatePostParameter());

或者 通过手写cookies的方式也行

string JSESSIONID =“”;
string GSID=“”;
var handler = new HttpClientHandler() { UseCookies = false }; //手写cookies
HttpClient httpClient = new HttpClient(handler);
httpClient.Timeout = TimeSpan.FromSeconds();
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# httpclient获取cookies实现模拟web登录的更多相关文章

  1. 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口

    数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...

  2. (九)HttpClient获取cookies

    原文链接:https://blog.csdn.net/cheny1p1ng/article/details/90780024 旧版本DefaultHttpClient 使用getCookieStore ...

  3. httpclient获取cookies

    Cookie[] cookies = httpClient.getState().getCookies(); System.out.println("==========Cookies=== ...

  4. HttpClient获取Cookie的两种方式

    转载:http://blog.csdn.net/zhangbinu/article/details/72777620 一.旧版本的HttpClient获取Cookies p.s. 该方式官方已不推荐使 ...

  5. 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...

  6. 十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies

    模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里 ...

  7. Java通过httpclient获取cookie模拟登录

    package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...

  8. 基于HttpClient的新版正方教务系统模拟登录及信息获取API

    简介 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录,再获取信息.模拟浏览器正常操作,封装请求头信息获取SESSIONID.模拟登录成功后切勿断开会话,依赖登录请求得到的C ...

  9. Java语言使用HttpClient模拟浏览器登录

    使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中 ...

随机推荐

  1. CodeForces - 556B Case of Fake Numbers

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  2. route命令实例练习

    第1章 命令配置 虚拟服务器 网卡配置信息 虚拟网卡名称 虚拟网卡模式 服务器01 eth1 10.0.0.10/24 nat模式 服务器02 eth2 10.0.0.11/24 nat模式 eth3 ...

  3. RPC 调用简述

    首先了解什么叫RPC,为什么要RPC,RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网 ...

  4. 详解tomcat的连接数与线程池

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  5. c#中获取路径方法

    要在c#中获取路径有好多方法,一般常用的有以下五种: //获取应用程序的当前工作目录. String path1 = System.IO.Directory.GetCurrentDirectory() ...

  6. CodeRush Xpress的菜单在VS2008SP1中不显示的解决方法

    将HKEY_LOCAL_MACHINE\SOFTWARE\Developer Express\CodeRush for VS\9.1中的HideMenu设置为0.若HideMenu不存在就创建个DWO ...

  7. java输出各种学生成绩

    class stu { public String stuno; public String name; public float math; public float english; public ...

  8. .net core2 发送电子邮件封装

    在.net core2 如何发送电子邮件呢,我们选择使用自带的System.Net.Mail,下面我们将如何使用封装成一个函数,供大家参考. /// <summary> /// 发送电子邮 ...

  9. Vue组件库 VV-UI 开始接受PR啦,有兴趣小伙伴可以一起参与开源哦。

    前言: 刚开源出来的VV-UI目前刚刚起步,组件不是很多,非常欢迎大家的pr和Star.项目地址: https://github.com/VV-UI/VV-UI演示地址: https://vv-ui. ...

  10. iOS开发中获取视图在屏幕上显示的位置

    在iOS开发中,我们会经常遇到一个问题,例如,点击一个按钮,弹出一个遮罩层,上面显示一个弹框,弹框显示的位置在按钮附近.如果这个按钮的位置相对于屏幕边缘的距离是固定的,那就容易了,可以直接写死位置.可 ...