使用SoapUI获取JSESSIONID后复用请求丢失会话的技术咨询
如何在SoapUI中正确维持JSESSIONID会话状态?
看起来你遇到了手动提取Cookie后会话无法维持的问题——明明把Request1的JSESSIONID存到属性里给其他请求用,结果服务器还是返回新的JSESSIONID,会话直接丢了。我来帮你排查下问题,给几个可行的解决方案。
首先,先揪出你代码里的明显bug
看你贴的代码,这里有个低级但致命的拼写错误:
def jsesid = matcher[0][0] log.info "$jsessid" // 变量名写成了jsessid,和上面的jsesid不一致! props.setPropertyValue('cookie',"$jsessid"); // 同样的错误
你定义的变量是jsesid,但后续引用的时候写成了jsessid,这会导致你存储到Properties里的是一个未定义的变量值(大概率是null或者空字符串)。其他请求带着无效的Cookie发送,服务器自然会创建新的会话,返回新的JSESSIONID。先把这个拼写错误修正,这是最基础的一步。
方法1:用SoapUI内置的Cookie自动管理(最省心,推荐)
其实SoapUI自带CookieJar功能,完全不需要手动提取Cookie,它会自动在同一个测试用例的请求之间共享Cookie。步骤很简单:
- 打开你的测试用例,点击顶部的齿轮图标(Test Case Options)
- 在弹出的窗口里找到Cookie Policy,设置为
standard或者compatibility - 确保所有需要共享会话的请求都在同一个测试用例下,SoapUI会自动保存Request1返回的JSESSIONID,然后自动在后续请求的头里带上它,完美维持会话。
方法2:修复手动提取Cookie的逻辑(如果必须手动处理)
如果因为某些原因必须手动提取Cookie,那要注意:服务器识别会话往往需要完整的Cookie信息,而不仅仅是JSESSIONID=xxx这一段。比如有些服务器会检查Cookie的Path、Domain属性,只传JSESSIONID的键值对可能不被认可。
修正后的提取代码如下:
// 获取所有Set-Cookie响应头 def setCookieHeaders = testRunner.testCase.testSteps["Request1"].testRequest.response.responseHeaders["Set-Cookie"] // 筛选出包含JSESSIONID的Cookie条目 def jsessionCookie = setCookieHeaders.find { it.contains('JSESSIONID') } if (jsessionCookie) { // 可以选择只保留JSESSIONID的键值对,或者保留完整的Cookie字符串(看服务器要求) def cookieValue = jsessionCookie.split(';')[0].trim() def props = testRunner.testCase.getTestStepByName("Properties") props.setPropertyValue('cookie', cookieValue) log.info "成功提取并保存Cookie: ${cookieValue}" } else { log.error "未从Request1的响应中找到JSESSIONID" }
然后在其他请求的请求头里,设置Cookie头的值为${#TestCase#cookie},确保引用的是正确的属性变量。
额外排查点
- 检查Request1的响应头:切换到Raw标签,确认
Set-Cookie里确实包含有效的JSESSIONID - 检查后续请求的请求头:确认
Cookie头已经正确带上了你存储的JSESSIONID,没有重复设置其他Cookie导致冲突 - 服务器端的Cookie规则:有些服务器会要求Cookie的
Path必须匹配,这时候你可能需要保留完整的Cookie字符串(包括; Path=/这类属性)
内容的提问来源于stack exchange,提问作者plaidshirt
相关产品推荐
相关产品推荐

