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();
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登录的更多相关文章
- 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口
数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...
- (九)HttpClient获取cookies
原文链接:https://blog.csdn.net/cheny1p1ng/article/details/90780024 旧版本DefaultHttpClient 使用getCookieStore ...
- httpclient获取cookies
Cookie[] cookies = httpClient.getState().getCookies(); System.out.println("==========Cookies=== ...
- HttpClient获取Cookie的两种方式
转载:http://blog.csdn.net/zhangbinu/article/details/72777620 一.旧版本的HttpClient获取Cookies p.s. 该方式官方已不推荐使 ...
- 第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
第三百三十三节,web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录 模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于star ...
- 十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
模拟浏览器登录 start_requests()方法,可以返回一个请求给爬虫的起始网站,这个返回的请求相当于start_urls,start_requests()返回的请求会替代start_urls里 ...
- Java通过httpclient获取cookie模拟登录
package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...
- 基于HttpClient的新版正方教务系统模拟登录及信息获取API
简介 通过HttpClient获取网页数据源,通过Jsoup解析数据.先模拟登录,再获取信息.模拟浏览器正常操作,封装请求头信息获取SESSIONID.模拟登录成功后切勿断开会话,依赖登录请求得到的C ...
- Java语言使用HttpClient模拟浏览器登录
使用HttpClient来模拟浏览器登录网站,然后可以进行操作,比如发布信息等 第一步:获取实际的post网址,(不考虑复杂情况下) 1.需要使用到firefox的httpfox插件,httpfox中 ...
随机推荐
- Peaceful Commission
Peaceful Commission Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Pendant
Pendant Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Codeforces 376B. Coupons and Discounts
B. Coupons and Discounts time limit per test 1 second memory limit per test 256 megabytes input stan ...
- 【JDK1.8】JDK1.8集合源码阅读——LinkedHashMap
一.前言 在上一篇随笔中,我们分析了HashMap的源码,里面涉及到了3个钩子函数,用来预设给子类--LinkedHashMap的调用,所以趁热打铁,今天我们来一起看一下它的源码吧. 二.Linked ...
- TOMCAT启动到一半停止如何解决
当你的项目过大的时候,往往会导致你的TOMCAT启动时间过长,启动失败,遇到该情况可以试一下下面两招: TOmcat启动到一半的时候停止了,以下原因: 1. tomcat启动时间超过了设置时间: 解 ...
- python的学习之路day1
软件:python3.pycharm开发工具 python的开始:print("hello world") 注意:python3需要加上() 1.变量是什么:在程序运行过程中它的值 ...
- [深度学习]实现一个博弈型的AI,从五子棋开始(1)
好久没有写过博客了,多久,大概8年???最近重新把写作这事儿捡起来……最近在折腾AI,写个AI相关的给团队的小伙伴们看吧. 搞了这么多年的机器学习,从分类到聚类,从朴素贝叶斯到SVM,从神经网络到深度 ...
- Spring Security 4 新增特性
1.概述 a) 特性 以下是Spring Security 4.0的新特性 Web Socket 支持 测试支持 整合Spring Data CSRF令牌参数解析 更安全的默认设置 role权限不再必 ...
- C# 扩展方法使用
为指定类型扩展方法: 定义类Class1: public static class Class1 //必须为static类,且不能包含 ...
- Zabbix 3.0 从入门到精通(zabbix使用详解)
第1章 zabbix监控 1.1 为什么要监控 在需要的时刻,提前提醒我们服务器出问题了 当出问题之后,可以找到问题的根源 网站/服务器 的可用性 1.1.1 网站可用性 在软件系统的高可靠性(也 ...