在对Carte+kettle的性能测试过程中,通过在loadrunner中用web_set_user("cluster", "cluster","172.17.2.89:8080");可以登录carte服务页面,但是压力测试过程中发现报告中产生了大量的HTTP 401请求。虽然这个错误不影响最终的测试,但是让追求完美的我,感觉不舒服,总觉得哪里有个重要事情我没搞明白。
通过Fiddler工具也能捕捉到这个401错误,但是登录成功后,接着就是HTTP 200,这和loadrunner返回结果一致(先报401,接着就报200)。
这是为什么呢,难道是Carte服务有问题?带着这个问题上网找相关资源,同时与开发一起探讨,最终得到一个比较有说服力的解答如下:
------------------------------------------------------------------------------------------------------------------------------------------------------------------
关于BASIC认证的过程
1. 客户端向服务器请求数据,请求的内容可能是一个网页或者是一个其它的MIME类型,此时,假设客户端尚未被验证,则客户端提供如下请求至服务器:
Get /index.html HTTP/1.0
Host:www.google.com
2. 服务器向客户端发送验证请求代码401,服务器返回的数据大抵如下:
HTTP/1.0 401 Unauthorised
Server: SokEvo/1.0
WWW-Authenticate: Basic realm="google.com"
Content-Type: text/html
Content-Length: xxx
3. 当符合http1.0或1.1规范的客户端(如IE,FIREFOX)收到401返回值时,将自动弹出一个登录窗口,要求用户输入用户名和密码。
4. 用户输入用户名和密码后,将用户名及密码以BASE64加密方式加密,并将密文放入前一条请求信息中,则客户端发送的第一条请求信息则变成如下内容:
Get /index.html HTTP/1.0
Host:www.google.com
Authorization: Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxx
注:xxxx....表示加密后的用户名及密码。
5. 服务器收到上述请求信息后,将Authorization字段后的用户信息取出、解密,将解密后的用户名及密码与用户数据库进行比较验证,如用户名及密码正确,服务器则根据请求,将所请求资源发送给客户端
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
说明这个401错误是由HTTP BasicAuthenticator认证机制决定的,虽然得到了解答,但我还是不满意,如何才能不报这个错呢,对比了一下Jmeter,就发现Jmeter没有这个问题,因为Jmeter通过加HTTP授权管理器就能解决,如下所示:对比loadrunner的web_set_user函数,我们会发现,Loadrunner正是少了这个BASIC_DIGEST属性,通过网上找资料,发现一个英文的资料有很明确的说明,参考链接如下
https://ptfrontline.wordpress.com/2009/12/23/loadrunner-http-401-authentication/
针对这上面英文资料说明,我就在web_set_user("cluster", "cluster","172.17.2.89:8080");后面再加一句web_set_sockets_option("INITIAL_BASIC_AUTH","1"); 然后回放脚本,不再报401错误,很正常的显示出HTTP 200,而且直接马上显示完美的 Show status ! 给自己鼓个掌!!!!!
最后提供一下http 基本认证登录的脚本以供大家参考:
web_set_user("cluster",
"cluster", //r_decrypt("58cf7265b1677820107f74"), //可以选择对密码加密
"172.17.2.89:8080");
web_set_sockets_option("INITIAL_BASIC_AUTH","1");
web_url("172.17.2.89:8080",
"URL=http://172.17.2.89:8080/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t2.inf",
"Mode=HTTP",
LAST);