昨天被人问了一个问题:为什么我用Jmeter先创建一个登录请求,然后创建一个操作(比如计算账单)请求,运行之后结果树中却是status_code=401(即登录失败),我明明登录了啊....
emmm.....,这貌似是我回答过几次的问题,而且好像新人都容易犯这个错,我觉得我有必要写点什么。
首先我们来了解一下这个“登录”。一个网站呢,我们一般先登录,然后登录成功进入网站执行一些操作。这看上去和上面的流程一模一样,没毛病。这是UI层的,我们在深入点,到接口层。
为什么你不登录的时候直接访问计算账单的url,系统会自动帮你跳转到登录界面呢?因为它通过一些机制判断了你不是“登录中”的状态。
而这机制中,简单的来说就是用一个值的合法性来判定,即Cookie(假设这个系统是用的cookie校验机制,当然还有什么token之类的啦,具体看系统)。
而我们使用浏览器登录-->计算账单-->付款...等一系列流程之所以这么顺畅,是因为浏览器在之后发送请求的时候自动带上了你登录所产生的Cookie(浏览器这种机制为后来的Xss和Csrf攻击提供了好环境)。
登录过程中客户端(浏览器)和服务器的交互,简单点说大概是这样的:(其实之前应当还有两步:1、用户在客户端(浏览器)上进行访问;2、服务器收到请求返回一个状态码401,告知客户端需要登录。这样才是一个比较健全的登录过程)
1、用户在浏览器中输入账号和密码,发起登录请求(requests);
2、服务器端收到请求,校验账号和密码的正确性。如果正确,返回一个“登录成功”的响应(response)给用户,这个response中会有一个字段Cookie;
3、然后用户之后发起的每个request中都会带上cookie这个字段;
4、服务器之后会通过这个cookie来识别这个用户,进而判断用户是否合法;()
以上,写的比较简单吧,知道这个意思就行。若想了解关于“登录”过程中的交互具体细节,百度一下就OK了。
看完了上面的这个过程,这下应该知道为什么提示status_code=401了。因为你只是请求了登录接口,然后就继续执行下面的计算账单了,计算账单这个请求的cookie(令牌)呢?没有,那么不好意思,服务器就不会认你,直接拒绝。
常见的解决方法有两种:
方法1:在登录请求后面加个后置处理器-->正则提取表达器,把登录后response中的cookie提取出来,然后当做一个参数塞进计算账单的Sampler中。
方法2:通过抓包等方式获取登录后的cookie,然后在线程组下面加个配置元件-->HTTP Cookie管理器,把Cookie写进去,这样这个线程组中的所有Sampler执行的时候都会带上这里面的参数。(注意cookie的有效期)
具体实现细节就不说了,都是Jmeter基础中的基础,百度一下【Jmeter 正则提取】【Jmeter Cookie管理器】就行。
____雪中悍刀行