jmeter-second post请求没有使用在我的登录post请求中创建的JSESSIONID



我成功地向登录终点发送了POST请求,并创建了JSESSIONID。我知道JSESSIONID由我线程顶部的HTTP Cookie管理器保存,因为我看到它被用于我线程中的几个GET请求。

但当我尝试POST请求时,它不使用JSESSIONID,而是创建自己的ID。以下是我的设置:

协议:https方法:POST-使用KeppAlive{"json":"params"}

采样器结果:线程名称:模拟测试1-1样本开始时间:美国东部时间2014-02-18 15:42:42加载时间:95延迟:95大小(字节):239标头大小(字节):239正文大小(字节):0样本计数:1错误计数:0响应代码:302响应消息:找到

响应标头:找到HTTP/1.1 302服务器:Apache Coyote/1.1设置Cookie:JSESSIONID=F16BF82F28A84F6E28dDDE30DECDC48C;路径=/;保护HttpOnly位置:https://api.zzzzzz.com/site/reneedsAuth内容长度:0日期:2014年2月18日星期二20:42:42 GMT

HTTPSampleResult字段:内容类型:数据编码:空

请求:POST https://api.zzz-com/rest/members/347/passions

POST数据:{"relationshipToMember":null,"authorizedToBook":false,"authorizedToFly":true,"authorifiedToGetInfo":false、"passenger":{"firstName":"Mighty"、"middleName":null、"lastName":《Max》、"dateOfBirth":1380857200000}}

[无cookie]

请求标头:连接:保持活动内容类型:application/json内容长度:204主持人:api.zzz.com用户代理:Apache HttpClient/4.2.6(java 1.5)

-注意:我不知道我是否正确地执行了GET请求,但它们正在工作。他们打开了Follow Redirects,它首先转到http://api.zzz…-302 Found,然后转到https://api.zzz…

编辑:我发现这正是我的问题:Apache JMeter的Cookie管理器没有';t将cookie添加到POST请求中,但如果有人能详细说明步骤,我不理解他的解决方案。

更新已解决:我不得不在POST中保留与日志相同的服务器名称,并更改路径

更新

尚未注意到您的https协议。

您只需要在jmeter.properties文件中设置CookieManager.save.cookies=true属性,或者将其作为参数添加到JMeter命令行中作为

jmeter -JCookieManager.save.cookies=true -n -t path_to_jmx_script.jmx -l path_to_log_file.jtl

留下我的其余回应,以防其他人需要它作为如何在不同线程组之间共享JMeter Cookie的指南。

我无法使用以下场景在我的环境中重现您的用例:

  • HTTP Cookie管理器位于测试计划下(与线程组级别相同)
  • HTTP Cookie管理器位于线程组下(与Samplers级别相同)

只有当HTTP Cookie管理器作为登录请求的子项添加时,它才是可复制的。如果是你的情况,将其提升1级以扩大其范围。

如果出于某种原因,它没有帮助-请参阅以下可能的解决方法详细信息。

你的响应代码204听起来不像是一个错误。我想,如果基于cookie的身份验证出现问题,服务器更愿意用401403之类的代码进行响应。

如果您明确需要设置cookie,仍然可以通过例如Beanshell 进行设置

您需要执行以下操作:

  1. 如果您要在不同的线程组之间共享cookie,或者由于任何其他原因需要将它们作为JMeter变量,请在jmeter.properties文件中设置CookieManager.save.cookies=true属性,或者在JMeter启动期间将其指定为jmeter -JCookieManager.save.cookies=true
  2. 将Beanshell Post Processor添加到您的登录请求中,代码如下:

    import org.apache.jmeter.protocol.http.control.CookieManager;
    CookieManager manager = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager").getObjectValue();
    props.put("cookiecount", String.valueOf(manager.getCookieCount()));
    for (int i = 0; i < manager.getCookieCount(); i++) {
    props.put("cookie_name" + i, manager.get(i).getName());
    props.put("cookie_value" + i, manager.get(i).getValue());
    props.put("cookie_domain" + i, manager.get(i).getDomain());
    props.put("cookie_path" + i, manager.get(i).getPath());
    props.put("cookie_expires" + i, String.valueOf(manager.get(i).getExpires()));
    props.put("cookie_secure" + i, String.valueOf(manager.get(i).getSecure()));
    }
    
  3. 将Beanshell预处理器添加到您的POST请求中,代码如下:

    import org.apache.jmeter.protocol.http.control.CookieManager;
    import org.apache.jmeter.protocol.http.control.Cookie;
    import org.apache.jmeter.testelement.property.JMeterProperty;
    
    CookieManager manager = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager").getObjectValue();
    int count = Integer.parseInt(props.getProperty("cookiecount"));
    for (int i = 0; i < count; i++) {
    Cookie cookie = new Cookie(props.getProperty("cookie_name" + i), props.getProperty("cookie_value" + i),
    props.getProperty("cookie_domain" + i), props.getProperty("cookie_path" + i),
    Boolean.parseBoolean(props.getProperty("cookie_secure" + i)),
    Long.parseLong(props.getProperty("cookie_expires" + i)));
    manager.add(cookie);
    }
    JMeterProperty cookieprop = ctx.getCurrentSampler().getProperty("HTTPSampler.cookie_manager");
    cookieprop.setObjectValue(manager);
    ctx.getCurrentSampler().setProperty(cookieprop);
    

解释:

第2点的代码从HTTP Cookie管理器获取所有可用的Cookie,并将它们存储到前缀为cookie_的JMeter Properties

第3点的代码读取所有以cookie_为前缀的属性,从中构造JMeter Cookies,并将它们添加到HTTPCookieManager中。

有关通过脚本扩展JMeter的更多信息,请参阅如何使用BeanShell指南。

我不得不在POST中保持与日志相同的服务器名称/IP,并更改路径

最新更新