【问题标题】:jsessionid cookie set in jmeter request not recognisedjmeter 请求中设置的 jsessionid cookie 无法识别
【发布时间】:2017-12-09 08:16:38
【问题描述】:

我想使用同一个会话并行执行一些 jmeter 线程组请求。为此,我创建了一个 setUp 线程组,该线程组对 JSESSIONID cookie(以及其他数据)进行身份验证并将其写入 CSV 文件。然后,后续线程组将使用该文件,以允许它们使用这些已经过身份验证的会话。 为此,我基本上遵循此处列出的解决方案:http://theworkaholic.blogspot.co.uk/2013/03/sharing-session-ids-across-threads.html

setUp 线程组正在按预期验证和生成 CSV 文件。但是,我无法在后续线程组中获取使用提供的会话的请求。我可以添加 JSESSIONID cookie(通过使用 BeanShell 预处理器或使用 HTTP Cookie 管理器,两者都给出相同的结果),但这似乎没有被识别。正在发送的请求如下:

POST https://test.mydomain.com:8443/prv/p/getUploadedfiles.action

POST data:
start=0&limit=10&sort=createdDate&dir=DESC&days=6

Cookie Data:
$Version=1; JSESSIONID="D0720DD3B06B5752DF6AC83A1B245EDA"; $Path="/"; 
$Domain="test.mydomain.com"

Request Headers:
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Host: test.mydomain.com:8443
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_121)

此请求的返回状态为 302,以重定向到登录页面。这与在 setUp 线程组中成功执行的相同请求相比:

POST https://test.mydomain.com:8443/prv/p/getUploadedfiles.action

POST data:
start=0&limit=10&sort=createdDate&dir=DESC&days=6

Cookie Data:
JSESSIONID=D0720DD3B06B5752DF6AC83A1B245EDA

Request Headers:
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 49
Host: test.mydomain.com:8443
User-Agent: Apache-HttpClient/4.5.3 (Java/1.8.0_121)

请求之间的唯一区别似乎是在 cookie 数据上显式设置的 $Version、$Path 和 $Domain。 [有趣的是,上述链接解决方案中的“Cookie 数据”似乎是正确的,我的意思是请求输出中不包含 $Version、$Path 或 $Domain] BeanShell PreProcessor 代码为:

import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.Cookie;

Cookie cookie = new Cookie("JSESSIONID", vars.get("jsessionid"), "test.mydomain.com", "/", true, -1);
CookieManager manager = sampler.getCookieManager();
manager.add(cookie);
log.info("Cookie added: " + vars.get("jsessionid"));

有谁知道为什么 JSESSIONID cookie 没有被识别?

【问题讨论】:

    标签: session cookies jmeter session-cookies jsessionid


    【解决方案1】:

    Cookie 范围仅限于当前线程组。这同样适用于 JMeter 变量。如果您需要在不同的线程组之间传递对象,则必须通过bsh.shared namespace 或将 JMeter 变量转换为对整个 JVM 全局的 JMeter 属性来完成。请参阅Knit One Pearl Two: How to Use Variables in Different Thread Groups 文章,例如 JMeter 变量到 JMeter 属性的转换。

    【讨论】:

    • 我正在从文件中读取 cookie 值并使用它在每个线程组中显式设置,因此这不适用。它现在工作(见我的评论)。无论如何,谢谢。
    • 请注意,您还可以使用线程间通信预处理器(附加插件)在不同线程组之间共享对象 - 这是我的下一个任务!
    【解决方案2】:

    我通过删除 BeanShell 预处理器并使用 HTTP Cookie 管理器添加 cookie 并将“Cookie 策略”设置为“标准”(之前设置为“兼容性”)解决了这个问题。

    【讨论】:

      【解决方案3】:

      打开 jmeter.properties 查找CookieManager.save.cookies 并将其设置为true 您应该在同一个线程组中有一个 HTTP Cookie 管理器 希望对您有所帮助

      【讨论】:

        猜你喜欢
        • 2015-10-02
        • 2018-08-23
        • 1970-01-01
        • 2013-12-02
        • 2013-06-13
        • 2020-03-09
        • 1970-01-01
        • 1970-01-01
        • 2017-03-29
        相关资源
        最近更新 更多