Cookie中特殊字符的坑

本文介绍了如何在服务端处理Cookie,并提供了具体的代码实现示例。同时,文中还详细讨论了Cookie的兼容性和内容限制等问题,帮助开发者更好地理解和使用Cookie。

服务端代码

Cookie[] cookies = request.getCookies();
LOGGER.info("historyOrder.cookies=" + JsonUtils.toJson(cookies));
Cookie userIdCookie = CookieUtil.getCookieByName(request, "userId");
if (null == userIdCookie || StringUtils.isBlank(userIdCookie.getValue())) {
    responseDto.setErrno(11);
    responseDto.setErrmsg("请求参数异常![0002]");
    return responseDto;
}
String cookieUserId = userIdCookie.getValue();
LOGGER.info("historyOrder.cookies.userId=" + cookieUserId);

//附CookieUtil.getCookieByNamey方法
public static Cookie getCookieByName(HttpServletRequest request, String name) {
    Map<String, Cookie> cookieMap = readCookieMap(request);
    if (cookieMap.containsKey(name)) {
        Cookie cookie = (Cookie) cookieMap.get(name);
        return cookie;
    } else {
        return null;
    }
}

public static Map<String, Cookie> readCookieMap(HttpServletRequest request) {
    Map<String, Cookie> cookieMap = new HashMap<String, Cookie>();
    Cookie[] cookies = request.getCookies();
    if (null != cookies) {
        for (Cookie cookie : cookies) {
            cookieMap.put(cookie.getName(), cookie);
        }
    }
    return cookieMap;
}
测试代码:
document.cookie="userId=liuzhichong;path=/;Max-Age=360000000"
测试结果
historyOrder.cookies.userId=liuzhichong

=====================================================
下面这2个测试是有问题的哟

测试代码:
document.cookie="userId=liuzhichong@;path=/;Max-Age=360000000"
测试结果
historyOrder.cookies.userId=liuzhichong

测试代码:
document.cookie="userId=liuzhi@chong@;path=/;Max-Age=360000000"
测试结果
historyOrder.cookies.userId=liuzhi

参考文章:http://www.blogjava.net/stone2083/archive/2010/11/03/336923.html

我们在实际使用Cookie过程中要注意一些问题:

  1. Cookie的兼容性问题

  Cookie的格式有2个不同的版本,第一个版本,我们称为Cookie Version 0,是最初由Netscape公司制定的,也被几乎所有的浏览器支持。而较新的版本,Cookie Version 1,则是根据RFC 2109文档制定的。为了确保兼容性,JAVA规定,前面所提到的涉及Cookie的操作都是针对旧版本的Cookie进行的。而新版本的Cookie目前还不被Javax.servlet.http.Cookie包所支持。

  2. Cookie的内容

  同样的Cookie的内容的字符限制针对不同的Cookie版本也有不同。在Cookie Version 0中,某些特殊的字符,例如:空格,方括号,圆括号,等于号(=),逗号,双引号,斜杠,问号,@符号,冒号,分号都不能作为Cookie的内容。这也就是为什么我们在例子中设定Cookie的内容为“Test_Content”的原因。

  虽然在Cookie Version 1规定中放宽了限制,可以使用这些字符,但是考虑到新版本的Cookie规范目前仍然没有为所有的浏览器所支持,因而为保险起见,我们应该在Cookie的内容中尽量避免使用这些字符。

<think>嗯,用户想配置EMQX节点的cookie来消除警告信息。这个问题在分布式系统中很常见,因为Erlang节点间通信需要靠cookie认证。 用户提供的引用信息挺关键的。引用[1]提到修改emqx.conf文件里的cookie值就能解决,但引用[2]显示配置后警告依然存在,说明可能有更深层的问题需要排查。 用户应该是个运维人员或者物联网开发者,正在部署EMQX集群。ta的诉求很明确,就是消除烦人的启动警告,但背后可能还隐含了对集群稳定性的担忧——毕竟cookie配置不当会导致节点无法互通。 需要给用户完整的解决方案:首先要确认配置文件的正确位置和格式,emqx.conf里node.cookie参数默认是隐藏的,得取消注释再设置。然后要强调重启的必要性,因为Erlang运行时只在启动时加载cookie。最后得提醒用户集群环境下所有节点必须使用相同cookie,这个特别容易出错。 用户可能遇到的都列出来:注释没取消、没重启服务、集群cookie不一致、使用了特殊字符。特别是最后一点,Erlang的cookie只允许字母数字和下划线,很多人会忽略这个限制。 对了,还得教用户怎么验证配置是否生效,看日志是最直接的。如果还有问题,可能需要检查环境变量覆盖的情况——就像引用[2]显示的,EMQX_NODE__COOKIE的环境变量优先级高于配置文件。 解决方案要分步骤写清楚,从修改配置到重启验证,最后补充常见错误排查。用户需要的是可立即操作的指南,所以每个命令都要给出具体示例,比如emqx restart这种。</think>要在EMQX中正确配置`node.cookie`以消除警告信息,请按以下步骤操作: --- ### **步骤 1:定位配置文件** 打开EMQX的主配置文件: **路径**:`emqx/etc/emqx.conf`(默认安装路径) ```bash vim emqx/etc/emqx.conf # 使用文本编辑器打开 ``` --- ### **步骤 2:修改 `node.cookie` 参数** 1. 在配置文件中搜索 `node.cookie` 2. **取消注释**该行(删除行首的 `#`) 3. 设置一个自定义的cookie值(**仅允许字母、数字、下划线**) ```conf ## 修改前(默认被注释): # node.cookie = emqxsecretcookie ## 修改后(取消注释并修改值): node.cookie = your_secure_cookie_123 # 例如:emqx_cluster_auth ``` > ⚠️ **注意**: > - Cookie值需满足Erlang分布式协议要求,**不可包含特殊字符**(如`@`、`:`、空格等) > - 集群中所有节点的cookie值**必须完全相同** --- ### **步骤 3:重启EMQX服务** ```bash emqx restart # 重启使配置生效 ``` --- ### **步骤 4:验证配置** 检查启动日志,确认无警告: ```bash tail -f emqx/log/emqx.log ``` 成功输出示例: ```log 2024-09-18T15:02:41.480367517Z EMQX_NODE__COOKIE [node.cookie]: your_secure_cookie_123 2024-09-18T15:02:41.480412524Z EMQX node is started successfully! ``` --- ### **常见问题排查** 1. **配置未生效**: - 确保修改的是 `emqx.conf` 而非其他配置文件 - 检查是否误留 `#` 注释符号 - 通过命令验证配置加载: ```bash emqx eval 'erlang:get_cookie().' # 应返回修改后的cookie值 ``` 2. **环境变量覆盖**: 若通过环境变量设置(如Docker部署),需确保优先级: ```bash # Docker示例:通过环境变量覆盖配置 docker run -d --name emqx \ -e "EMQX_NODE__COOKIE=your_cookie" \ emqx/emqx:5.6.0 ``` 3. **集群配置不一致**: **所有节点**的`node.cookie`必须一致,否则节点间无法通信并报错[^2]。 --- ### **关键总结** | 配置项 | 要求 | 示例值 | |----------------|------------------------------|----------------------| | `node.cookie` | 字母/数字/下划线,无特殊字符 | `emqx_cluster_auth1` | | 配置文件路径 | `emqx/etc/emqx.conf` | | | 生效条件 | 重启EMQX服务 | `emqx restart` | [^1]: 修改`emqx.conf`中的`node.cookie`是消除警告的标准方法,需确保格式正确且重启服务。 [^2]: 集群中cookie不一致会导致节点通信失败,日志会显示`** Connection attempt from disallowed node **`等错误。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明月(Alioo)

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值