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中 ...
随机推荐
- Jimmychoo商城系统总结
一.需求 1.游戏模块 ①在进入H5之前,首先有一个动态的探照灯的动效,然后由"淡出"效果到H5首页. ②在点击"开始游戏"之后会有一段动画演示游戏内容,然后滑 ...
- JavaNIO缓冲区
package com.nio.test; import java.nio.ByteBuffer; import org.junit.Test; /** * * @author fliay * * 一 ...
- NHibernate查询示例合集
基本查询 复杂查询示例 /// <summary> /// 获取自定义表单数据中属于部门的部分 /// </summary> /// <param name=&quo ...
- 学习笔记-----php搭建用户管理系统
后台:php,数据库:mysql,前端:html,css,js; 主要页面介绍: 1.php连接数据库后台,读取数据并将其以表格的形式显示,并且有添加,编辑,删除,分页等功能: 2.php用于添加用户 ...
- sql连接语句
简述 简单回顾并总结下不同的表连接语句有什么异同之处以及一些概念. 建库语句如下 DROP DATABASE IF EXISTS `demo`; CREATE DATABASE `demo`; USE ...
- C#中访问私有成员
首先访问一个类的私有成员不是什么好做法.大家都知道私有成员在外部是不能被访问的.一个类中会存在很多私有成员:如私有字段.私有属性.私有方法.对于私有成员造访,可以套用下面这种非常好的方式去解决. pr ...
- python进阶------进程线程(四)
Python中的协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其 ...
- 2017/10/10 jar包错误
Description Resource Path Location Type Archive for required library: 'WebContent/WEB-IN ...
- 如何管理Session(防止恶意共享账号)——理论篇
目录 知识要求 背景 技术原理 如何管理Session remember me的问题 附录 知识要求 有一定的WEB后端开发基础,熟悉Session的用法,以及与Redis.Database的配合 本 ...
- Windows server2012如何运行Javaweb项目?
最近用java写了个小项目,想要部署到服务器,于是买了个Windows server2012,但是不知道怎么部署,后来才知道需要配置java运行环境.经过一番研究最终搞定了.下边是我的个人总结,由于是 ...