一、事件还原:
某项目中需要先进行登录,才可以进行查询请求:
1.请求一是登录请求,返回的response中会有cookie;请求二是查询请求,它的header中需要传入请求一的cookie;
2.直接用grinder来抓取请求一,从得到的结果来看:
不仅没有我需要的cookie信息,并且请求也不是我发送的请求了。于是知道这个请求被重定向了;
3. 用jmeter进行验证,果真,在发送了请求一之后,这个http请求被重定向了2次:
4. 知道了刚才用grinder脚本抓取到的请求一返回的结果其实是重定向到http://study.163.com这个请求返回的response,但是我需要的cookie其实是存在于3中的请求a中;
5. 但是HTTPRequest返回的response结果默认是请求c的结果,怎么办呢?
二、 解决方法:
HTTPClient 库处理cookies交互并且把cookie的头部从响应中删除,如果你想要得到这些cookie,一个方法就是定义你自己的 CookiePolicyHandler。所以下面这个脚本就定义了一个CookiePolicyHandler,可以简单的记录所有的发送的以及接收的cookie,这一小段代码也演示了怎么查询当前线程缓存的那些cookie,以及怎么从缓存中添加和删除cookie。
1.脚本内容
from HTTPClient import CookieModule
...
...
def login(self):
HTTPPluginControl.getConnectionDefaults().useCookies=1
result = request1.GET('/your_request')
threadContext = HTTPPluginControl.getThreadHTTPClientContext()
cookies = CookieModule.listAllCookies(threadContext)
return cookies
最后返回的这个cookies就是所有的url(当然也包括跳转的url)的cookie。
2. HTTPPluginControl.getConnectionDefaults().useCookies,当这个选项为1时,表示自动获取cookie的头部,如果是0则表示是自定义的cookie头部;
按照上述方法就可以得到全部的cookies,也就可以从cookies中随心所欲的取出你所需要的cookie了。
三、 知识点补充
例如要去某个机关办理手续:
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
由于HTTP是无状态协议,它不对之前发生过的请求和响应的状态进行管理,也就是说,无法根据之前的状态进行本次的请求处理。假设要求登录认证的web页面本身无法进行状态的管理,那么每次跳转新页面部署要再次登录,就是要在每次请求报文中附加参数来管理登录状态。无状态协议由于不用保存状态,所以可以减少服务器的cpu和内存资源的消耗。
但是为了保留无状态协议的这个优点,又要解决反复登录等的这个矛盾问题,引入了cookie技术,它通过在请求和响应报文中写入cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie的首部字段信息,通知客户端保存cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入cookie值后发送出去。然后服务器端在接收到客户端发送过来的cookie之后,会去检查到底是哪个客户端发来的连接请求,再和服务器上的记录进行对比,得到之前的状态信息。可以用下图来表示:
本文来自网易实践者社区,经作者齐红方授权发布。