本篇介绍使用JMeter 如何对需要登录的站点进行压力测试。
基本Session验证的机制
使用session进行请求验证的机制是一种常见的Web应用认证方式。 该认证方式的主要内容如下:
一、登录过程
- 用户输入:用户在登录页面输入用户名和密码。
- 发送请求:浏览器将用户名和密码作为请求参数发送到服务器。
- 服务器验证:服务器接收到请求后,验证用户名和密码的正确性。
- 如果验证失败,服务器返回错误信息,提示用户重新输入。
- 如果验证成功,服务器会创建一个session对象,并将用户信息(如用户名、权限等)存储在session中。
- 生成session ID:服务器为每个session生成一个唯一的session ID,用于标识该session。
- 发送session ID:服务器将session ID通过Set-Cookie响应头字段发送给客户端(浏览器),并指示浏览器保存该Cookie。
二、请求验证过程
- 发送请求:用户在后续访问需要认证的页面或接口时,浏览器会自动将保存的包含session ID的Cookie附加在HTTP请求的头字段Cookie中发送给服务器。
- 服务器验证:服务器接收到请求后,从请求头中的Cookie提取session ID。
- 服务器根据session ID查找对应的session对象。
- 如果找到对应的session对象,且session未过期,则认为用户已经登录,并允许访问该页面或接口。
- 如果未找到对应的session对象,或session已过期,则认为用户未登录或会话已失效,服务器将返回错误信息或重定向到登录页面。
三、session管理
- session存储:session对象通常存储在服务器上,可以是内存、数据库或文件等。
- session过期:服务器可以设置session的过期时间,当session超过过期时间时,服务器将自动销毁该session对象。
- session注销:用户可以通过点击注销按钮或关闭浏览器等方式注销登录。注销时,服务器将销毁对应的session对象,并清除客户端的Cookie。
捡重点来说:
- 服务端产生Session ,并生成一个sessionID 给浏览器端
- 浏览器端保存这个SessionID到Cookie 中
- 后续浏览器端请求资源的时候都会带上这个SessionID
- 服务端验证这个SessionID是否正确和有效。
基于Session登录验证的JMeter 测试
使用JMeter 测试使用Session验证的站点很简单:
- 调用登录的接口
- 调用其他的接口
也就是在调用需要测试的接口前,想调用登录的接口, JMeter 会自动保存登录成功后的SessionID 并且后续请求会自动带上这个Cookie,这里自动带的原因是因为这个Cookie是通用的,也就是 * JSESSIONID。
JSESSIONID是一个特定类型的Cookies,用于跟踪用户会话。它是由Java Servlet规范定义的一种机制,用于在用户与Java Web应用程序之间保持会话状态。
基于以上在JMeter 中建立的测试项目就基本上很简单:
- 线程组下面包含一个登录请求以及若干个获取数据的请求。
实战场景之复杂验证
这里遇到一个实战的项目,因为单点登录或是安全性的要求,除了JSESSIONID之外,会额外产生一个Token 进行验证。原因是:
- 这个站点本身调用了多个其他的服务,而调用其他服务的验证就是使用token 的方式。
- 同时这个站点本身也是使用自行产生的token 进行验证
在调用登陆之后,会将这个通过通过响应内容的方式返回。
在JMeter 中需要从响应中解析出这个Token 附件到后续请求中。
于是需要在Login的请求中添加一个 Regular Expression Extractor解析出自行产生的Token。
需要从返回中通过Regular Expression Extracotor
解析Token , 附加到请求头中, 解析的配置类似如下:
除以上外,还需要添加一个HTTP Cookie Manager, 以便在后续的请求中附加上这个Cookie:
测试计划的完整结构如下: