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


    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登录

  • 相关阅读:
    mac给文件夹添加权限命令,mac设置文件夹权限
    idea自动生成Entity类的get方法和set方法
    mac连接linux服务器远程
    phpstorm中设置文件保存后自动上传FTP
    cmd删除文件夹或删除文件
    SpringBoot封装增删改查接口
    修改 Docker 的默认存储路径
    ES6ES11 20152020
    js开发中可用的位运算
    Git 修改最近一次的提交注释 包括已push和未push
  • 原文地址:https://www.cnblogs.com/grj001/p/12223229.html
Copyright © 2020-2023  润新知