今天工作遇到这样一个场景,我需要获取一个游戏目录列表,这个列表接口在线上已经存在,但是这个接口需要登录认证后才能获取到,所以实现这个功能我打算分两部来做:

1、首先调登录接口,以写上session

2、调游戏目录接口

在测试中,走第二步时,始终获取不到游戏目录,提示session 不存在,我就纳闷了。。明明已经写上session了啊,接着我用浏览器测试了这个步骤,完全是能跑通的,但是仔细一看,使用浏览器抛第二个接口时,请求头中会把sessionid带上,瞬间顿悟:

当客户端第一次请求session对象时候,服务器会为客户端创建一个session,并将通过特殊算法算出一个session的ID,用来标识该session对象,当浏览器下次(session继续有效时)请求别的资源的时候,浏览器会偷偷地将sessionID放置到请求头中,服务器接收到请求后就得到该请求的sessionID,服务器找到该id的session返还给请求者使用。一个会话只能有一个session对象,对session来说是只认id不认人。

然后决定尝试模拟浏览器,再发起第一个请求后把服务端返回的sessionid保存下来,然后再调用第二个接口时,请求头带上这个sessionid,果然把问题给解决了,附代码如下:

  1. private static RestResponseCookie prelogin(string serverurl, string userid, string key, string serverid, string strTimestamp, string source, string usersource)
  2. {
  3. string url = "";
  4. string SignValueFormat = string.Format("serverid={0}&userid={1}&usersource={2}&timestamp={3}&key={4}", serverid, userid, usersource, strTimestamp, key);
  5. string Sign = TR188.Utils.Security.TrSecurity.getMd5Hash(SignValueFormat);
  6. url = serverurl + "GS/Per_CheckLogin/";
  7.  
  8. var data = new SortedDictionary<string, string>();
  9. data.Add("serverid", serverid);
  10. data.Add("userid", userid.ToString());
  11. data.Add("usersource", usersource + "/" + source);
  12. data.Add("timestamp", strTimestamp);
  13. data.Add("hash", Sign);
  14.  
  15. var request = new RestRequest(Method.GET);
  16. try
  17. {
  18. var client = GetRequest(url, data, ref request);
  19. var resp = client.Execute<List<GameService>>(request);
  20. return resp.Cookies.SingleOrDefault(x => x.Name == "ASP.NET_SessionId");
  21.  
  22. }
  23. catch (System.Exception ex)
  24. {
  25. url = "";
  26. log.Error("check per_login error!" + ex.Message);
  27. }
  28. return null;
  29. }
  1. DESEncrypt des = new DESEncrypt();
  2. uint Access_deskey = uint.Parse(DateTime.Now.ToString("yyyyMMddHH"));
  3.  
  4. string accesskey = des.EncryptDES("userid=" + userid.ToString() + "&timestamp=" + timestamp.ToString(), Access_deskey);
  5. var data = new SortedDictionary<string, string>();
  6. data.Add("usersource", "baidu");
  7. data.Add("userid", userid.ToString());
  8. data.Add("accesskey", accesskey);
  9.  
  10. var request = new RestRequest(Method.GET);
  11. try
  12. {
  13. CookieContainer _cookieJar = new CookieContainer();
  14. _cookieJar.Add(new Cookie(cookie.Name, cookie.Value, cookie.Path, cookie.Domain));
  15. var client = GetRequest(url, data, ref request);
  16. client.CookieContainer = _cookieJar;
  17. var resp = client.Execute<List<GameService>>(request);
  18. log.InfoFormat("getwebgamelist:content={0}", resp.Content);
  19. using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp.Content)))
  20. {
  21. DataContractJsonSerializer json = new DataContractJsonSerializer(typeof(List<GameService>));
  22. List<GameService> result = (List<GameService>)json.ReadObject(stream);
  23. return result;
  24. }
  25. }
  26. catch (Exception ex)
  27. {
  28. log.Error("getwebgamelist:" + ex.Message);
  29. }

restsharp发送服务端请求回传session的更多相关文章

  1. 浏览器与服务端请求响应流程与HTTP协议

    浏览器与服务端请求响应流程图: 1.HTTP概要 1.1. 定义 HTTP(HyperText Transfer  Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种 ...

  2. Weblogic服务端请求伪造漏洞(SSRF)和反射型跨站请求伪造漏洞(CSS)修复教程

    一.服务端请求伪造漏洞 服务端请求伪造(Server-Side Request Forgery),是指Web服务提供从用户指定的URL读取数据并展示功能又未对用户输入的URL进行过滤,导致攻击者可借助 ...

  3. 【CTF WEB】服务端请求伪造

    服务端请求伪造 如你所愿,这次可以读取所有的图片,但是域名必须是www开头 测试方法 POST /index.php HTTP/1.1 Host: 218.2.197.236:27375 Conten ...

  4. 少部分手机浏览器对于COOKIE支持不够导致服务端无法读取session的解决方案

    相信大家都遇到过这样的问题,有手机浏览器的问题导致服务端SESSION读取不正常,目前在项目中的解决方法是采取H5手机本地存储唯一KEY解决的 代码片段 //定义json格式字符串 var userD ...

  5. 客户端向服务端请求连接是出现"ssh : Connection refused"原因有哪些

    注意:服务端的sshd服务已经正常开启 (可以正常进行连接) 1.在服务端负载比较高的情况下客户端请求连接时会出现连接被拒绝的情况

  6. 渗透之路基础 -- 服务端请求伪造SSRF

    简介:SSRF 服务器端请求伪造,有的大型网站在web应用上提供了从其他服务器获取数据的功能.使用户指定的URL web应用获取图片,下载文件,读取文件内容.通常用于控制web进而探测内网服务以及攻击 ...

  7. SSRF(服务端请求伪造)漏洞

    目录 SSRF SSRF漏洞的挖掘 SSRF漏洞利用 SSRF漏洞防御 SSRF SSRF(Server-Side Request Forgery,服务器端请求伪造)漏洞,是一种由攻击者构造请求,由服 ...

  8. SSRF(服务端请求伪造)

  9. 转-Android客户端和服务端如何使用Token和Session

    http://www.software8.co/wzjs/yidongkaifa/6407.html 对于初学者来说,对Token和Session的使用难免会限于困境,开发过程中知道有这个东西,但却不 ...

随机推荐

  1. WCF入门(六)---主机WCF服务

    建立一个WCF服务后,下一步就是托管它,以便客户端应用程序可以使用,这就是所谓的WCF服务托管. WCF服务可以通过使用任何的四种方法如下托管. IIS主机 - IIS是Internet信息服务的缩写 ...

  2. Tomcat启动报错:严重: StandardServer.await: create[8005] java.net.BindException: Cannot assign requested address

    org.apache.catalina.core.StandardServer await        SEVERE: StandardServer.await: create[8005]:    ...

  3. Servlet编写登录界面

    package com.mhb; import java.io.IOException;import java.io.PrintWriter; import javax.servlet.Servlet ...

  4. Android 自定义控件-TextView

    很多时候系统自带的View满足不了设计的要求,就需要自定义View控件.自定义View首先要实现一个继承自View的类.添加类的构造方法,override父类的方法,如onDraw,(onMeasur ...

  5. openCv 图像顺时针、逆时针旋转

    通过下面这个函数调用 Rotate90(workImg,270); //顺时针旋转 Rotate90(workImg,90); //逆时针旋转 实现,其实用该函数旋转任意度数对正方形图都ok,只是长方 ...

  6. HDU 4604 deque 最长上升子序列

    枚举每个位置,求以num[i]为起点的最长不下降子序列和以num[i]为结尾的最长不递增子序列. 并且把相同值的个数统计一下,最后要减去算重复了的. 比如: 1 9 4 4 2 2 2 3 3 3 7 ...

  7. Python中的split()函数的使用方法

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(lis ...

  8. Android log日志

    LOG是用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用. androidsdk中提供了l ...

  9. php有些系统会报错或提示 Cannot modify header information - headers already sent by

    Warning: Cannot modify header information - headers already sent by (output started at /home/test/do ...

  10. 新浪实时股票数据接口http://hq.sinajs.cn/list=code

    股票数据的获取目前有如下两种方法可以获取:1. http/javascript接口取数据2. web-service接口 1.http/javascript接口取数据1.1Sina股票数据接口以大秦铁 ...