cookie中保存中文与取出中文

本文介绍如何在JSP中使用Cookie存储中文字符。通过编码与解码的方法解决中文乱码问题,确保数据正确存储及读取。

jsp中的cookie这个小点心,有时,确实给我们带来不少的方便,但如果要用它来存贮中文可能有忙烦。要进行编码与解码。

如下所示:

String name = request.getParameter("name");
     name = java.net.URLEncoder.encode(name,"gbk");
     
     javax.servlet.http.Cookie c = new javax.servlet.http.Cookie("name",name);
     c.setMaxAge(10000);
     response.addCookie(c);

 

从cookie中取含有中文的数据时:

javax.servlet.http.Cookie cs[] = request.getCookies();
     for(javax.servlet.http.Cookie c:cs){
      if(c.getName().equals("name")){
       String cval = c.getValue();
       cval = URLDecoder.decode(cval,"gbk");
       out.println("name = " + cval);
      }
     }

OK,这样就可以解决问题了。

<think>首先,用户查询是:我想查找使用JMeter提响应头中多个Set - Cookie的方法。请问JMeter如何提响应头中的多个Set - Cookie? 从用户的问题中,我需要帮助用户实现如何在JMeter中提多个“Set-Cookie”响应头。用户提到他参考了两个引用的材料,但我会尽可能集中在他们的具体需求上。 用户提供的引用包括: - 引用[1]:展示了使用JSR223后置处理程序来提“Set-Cookie”并将它们串联起来。 - 引用[2]:讨论使用正则提器和BeanShell Sampler 提保存Cookie。特别提到了一个正则提器用于取出token值。 在实际操作中,常见用于在JMeter中提响应头的方法包括: 1. **正则表达式提器(Regular Expression Extractor)**:用于从响应数据中提文本模式。对于“Set-Cookie”,这可能效果并不理想,因为一个响应可能有多个“Set-Cookie”头。 2. **后置处理器插件(如JSR223 PostProcessor或BeanShell PostProcessor)**:允许使用脚本语言(如Groovy)直接访问和处理响应对象,包括响应头。 对于多个“Set-Cookie”值,提并准备用于后续请求: - 正确的方法是用脚本收集所有“Set-Cookie”值并将它们串联成一个Cookies字符串(格式为key=value; key2=value2;)。 基于引用[1],用户参考的方案使用了JSR223来循环处理所有响应头行,找到那些名为“Set-Cookie”的,提值,然后串联它们。 步骤分解: 1. 向HTTP请求添加“后置处理器”(Post Processor):例如“JSR223 PostProcessor”。 2. 使用Groovy脚本处理响应头:脚本需要取出完整的响应头字符串,分成行,过滤出以“Set-Cookie”开头的行,然后提值部分(通常在冒号后),并追加到一个字符串中。 3. 将串联的Cookies字符串保存到一个变量(例如“cookies”)中。 4. 之后,在后续的登录请求或其他需要Cookies的请求中添加一个“HTTP信息头管理器”,设置“Cookie”头为该变量的内容。 在脚本中: - `prev.getResponseHeaders()`:从SamplerResponse对象(`prev`)获完整响应头字符串。 - 按换行符拆分。 - 检查每行是否以“Set-Cookie”开头:更准确的方式是检查行中包含“Set-Cookie”。 - 对于匹配行,分割冒号:获得值部分(冒号后的内容),别忘了可能会有多个“:”,因此可第一个分隔后的右边字符。在引用中,他们只第二部分然后去空格后加到字符串中。 - 累积各值,中间加“; ”分隔符。 - 保留到变量中。 - 然后,可以在HTTP Headers管理器中使用该变量名作为“Cookie”。 在JMeter脚本中调用时,可能需要考虑其他线程组之间的共享,通常是通过一个跨线程组的变量传递。 总结提步骤: 以下是提多个“Set-Cookie”值的JSR223处理方式的详细步骤: 1. 在HTTP请求后添加JSR223 PostProcessor。 2. 语言选择:Groovy(建议选择,因为性能好)。 3. 代码示例: ```groovy import java.util.regex.Matcher; import java.util.regex.Pattern; StringBuilder cookieBuilder = new StringBuilder(); // 获响应头 String responseHeaders = prev.getResponseHeaders(); // 按照换行符分割 String[] headers = responseHeaders.split("\n"); Pattern setCookiePattern = Pattern.compile("Set-Cookie:\\s*(.*)"); // 使用模式匹配 for (String header : headers) { Matcher matcher = setCookiePattern.matcher(header); if (matcher.find()) { String cookieValue = matcher.group(1); // 捕获第一个组的值(不含“Set-Cookie: ”) cookieBuilder.append(cookieValue).append("; "); } } if (cookieBuilder.length() > 0) { // 删除最后一个分号和空格 String cookies = cookieBuilder.substring(0, cookieBuilder.length() - 2); vars.put("cookies", cookies); } else { vars.put("cookies", ""); // 如果没有cookie,可能设置为空 } ``` 我注意到在引用[1]中使用了类似的方法,但没有用正则表达式;它直接分割了“:”。但在拆分时,可能不够健壮(如果行内有多个分割符号)。用正则匹配更精确。 然而,在引用[1]中,脚本是: ```java StringBuilder re = new StringBuilder(); String[] split = prev.getResponseHeaders().split("\n"); for (String s : split) { String[] cookie_item = s.split(":"); if (cookie_item[0].equals("Set-Cookie")) re.append(cookie_item[1].trim() + ";"); } String substring = re.substring(0, re.length() - 1); // 移除最后一个分号 vars.put("responsecookie", substring); ``` 这基本能工作,但需要注意: - 响应头字符串如何分割:`split("\n")`可能在Unix/Windows文件格式下不一致;建议使用`\r\n`,但Java会规范化。 - 对于"Set-Cookie"的检查:是否刚好匹配"Set-Cookie"?如果没有,将失败。 - 只第一个冒号前的部分:实际上,分割了后,`cookie_item[0]`是key,`cookie_item[1]`是值,但有时值内也有冒号,因此更严谨的做法是只第一个冒号的索引再分割。 因此,改进版本可以如上面正则匹配那样。 另外,别忘了在JMeter中,后续步骤: - 在HTTP请求中添加一个HTTP Header Manager,并设置名称为“Cookie”,值为`${cookies}`(使用变量引用提的值)。 由于响应可能返回多个“Set-Cookie”,此脚本会将所有匹配的值串联成一个字符串以在“Cookie”头中重复使用。 此外,关于用户参考[2]的提示:“jmeter 提响应头中的set-Cookie”中提到了另一种方式——使用正则提器。但如果要提多个值,正则表达可能只提第一个匹配项(默认配置返回第1个匹配),除非设为一个能匹配所有值的复杂动态正则表达式并处理多个变量提(通过使用${variable_1}, ${variable_2}等序列)。但使用脚本通常是更灵活的方式。 在回答时,我会结构化: 1. 解释方法:使用JSR223后置处理器(推荐)或正则提器(但难提多个)。 2. 给出逐步指南。 3. 提供代码示例参考引用[1]并改进。 4. 指示如何在后续请求中使用保存Cookie变量。 最后,用户是中文查询,所以我应该提供中文回答。 还要添加相关的问题结尾,如系统指令所要求。 相关问题: 1. 在JMeter中使用Cookie后,如何在不同线程组间共享变量? 2. 如何使用正则表达式提取出一个值(如Token)? 3. JMeter中处理身份验证常见问题有哪些? 确保回答保持真实可靠,基于JMeter最佳实践。 </think> ### JMeter提响应头中多个Set-Cookie的方法 在JMeter中提响应头中的多个“Set-Cookie”值,推荐使用脚本方式处理(如**JSR223后置处理器**),因为“Set-Cookie”头通常可能返回多个键值对(如Session ID、Token等),直接使用正则表达式提器可能无法完整捕获所有值。以下是详细的步骤和方法: --- ### 一、核心方法:使用JSR223后置处理器(推荐) 这种方法基于您提供的引用[^1],但进行了优化,确保正确提所有“Set-Cookie”值,并将其合并为一个标准Cookie字符串,供后续请求使用。 1. **添加JSR223后置处理器** - 在登录请求或需要提Cookie的HTTP请求下,右键添加 **后置处理器 → JSR223后置处理器**。 - 语言选择 **Groovy**(推荐,因性能最佳)。 2. **复制粘贴以下脚本** 以下脚本会遍历所有响应头,筛选出所有以“Set-Cookie”开头的行,提值后合并为一个字符串: ```groovy StringBuilder cookieBuilder = new StringBuilder(); String headers = prev.getResponseHeaders(); // 获完整响应头 String[] headerLines = headers.split("\n"); // 按换行符分割成数组 for (String line : headerLines) { if (line.startsWith("Set-Cookie")) { // 提冒号后的值(去除开头空格) String cookieValue = line.substring(line.indexOf(":") + 1).trim(); cookieBuilder.append(cookieValue).append("; "); // 添加分号和空格 } } if (cookieBuilder.length() > 0) { // 删除末尾多余的分号和空格 String mergedCookies = cookieBuilder.substring(0, cookieBuilder.length() - 2); vars.put("mergedCookies", mergedCookies); // 保存到变量 } ``` **关键说明**: - 脚本自动处理多个Cookie值,例如: `Set-Cookie: session=abc; Set-Cookie: token=123` → 合并为 `session=abc; token=123`。 - 变量 `mergedCookies` 存储最终结果,可用于后续请求。 3. **在后续请求中使用Cookie** - 在另一个HTTP请求中,添加 **HTTP信息头管理器**。 - 添加一个新项: - 名称: `Cookie` - 值: `${mergedCookies}` ![HTTP Header Manager图示](https://jmeter.apache.org/images/screenshots/http_header_manager.png) (*JMeter官方文档中HTTP信息头管理示例[^3]*) --- ### 二、备选方法:正则表达式提器(适用于单个值) 如果只需提某个特定Cookie(如Token),可使用正则表达式提器(参考引用[^2]),但它**无法直接提多个Cookie值**: 1. 添加 **后置处理器 → 正则表达式提器**。 2. 配置参数: - 引用名称:`extractedCookie`(变量前缀) - 正则表达式:`Set-Cookie:\s*(.*?)=([^;]+)`(匹配键值对) - 模板:`$2$`(提值) - 匹配号:`-1`(所有匹配项,但默认只返回第一个值) 3. 缺陷:这种方法只能捕获第一个匹配值,需自定义处理多个变量(如`extractedCookie_1`, `extractedCookie_2`)。 --- ### 常见问题解决 - **为何响应头中看不到Set-Cookie?** 确保HTTP请求成功(响应码200),且服务器确实返回Cookie(检查“查看结果树”中的“响应头”选项卡)[^2]。 - **跨线程组使用Cookie?** 将 `vars.put("mergedCookies", ...)` 改为 `props.put("globalCookies", ...)`,然后用 `${__P(globalCookies)}` 引用[^1]。 --- ### 示例脚本执行流程 ``` 登录请求 → [JSR223后置处理器] → 提Cookie → [HTTP信息头管理器:Cookie:${mergedCookies}] → 其他API请求 ``` 通过上述方法,您可以高效处理多个Cookie值,避免手动拼接的复杂度。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值