COOKIE值中包括等号

系统中有一些值使用BASE64编码后存储在COOKIE中,当编码后的字符串最后有一个或者两个等号(=)时,使用Request.getCookies().getValue()会丢失等号,再BASE64解码时产生错误.

https://issues.apache.org/bugzilla/show_bug.cgi?id=44679,可以看到这个链接里面的讨论.

里面提到:

org.apache.tomcat.util.http.ServerCookie.ALLOW_EQUALS_IN_VALUE system property
that was introduced in Tomcat 6.0.24.  Looks like Mark has seen the light. :)
I just wanted to update this issue so everyone that needs this feature is aware
of it.

处理方法:
1) 直接从Http Head里面取Cookie的值,然后自己解析,保留value中的等号.(Cookie值的格式: name=value;name2=value2;name3=value3

2) Base64解码前,计算长度,补充等号后再解码

public static String decodeBase64(String s) {
        switch(s.length()%4) {
            case 3:
                s+= "==="; break; // 注:其实只需要补充一个或者两个等号,不存在补充三个等号的情况
            case 2:
                s+= "=="; break;
            case 1:
                s+= "="; break;
            default:
        }
        return new BASE64Encoder().decode(s.getBytes())););
    }

    public static String encodeBase64(String s) {
        String encoded = BASE64Encoder().encode(s.getBytes())));
        return encoded.replaceAll("[\n=]", "");
    }

备注:

Cookie规范介绍

 
在HTTP协议中,Cookie是一种小的数据片段,通常由客户端(如浏览器)发送给服务器,用于存储和跟踪用户的会话信息。如果你想在Cookie中设置自己的,可以按照以下步骤操作: 1. **创建Cookie**: 使用JavaScript的`document.cookie` API,它允许你在前端直接操作Cookie。例如: ```javascript document.cookie = "your_key=your_value; expires=Thu, 01 Jan 2024 00:00:00 UTC; path=/"; ``` 这里设置了两个键对:`your_key` 和 `your_value`,并且指定了过期时间和路径。 2. **键对格式**: - 键名(`your_key`)需要用等号分隔,然后键对之间用分号(`;`)隔开。 - 可选的参数包括 `expires`(过期时间)、`max-age`(以秒为单位的绝对过期时间)、`path`(指定Cookie应用的URL路径)、`domain`(限定在特定域名下生效)等。 3. **访问Cookie**: 如果需要获取已经设置的Cookie,可以在JavaScript中通过相同的键名读取,例如: ```javascript const cookieValue = getCookie('your_key'); function getCookie(name) { const nameEQ = name + '='; const ca = document.cookie.split(';'); for (let i = 0; i < ca.length; i++) { let c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1); } if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length, c.length); } } return null; } ``` 4. **注意安全性和隐私**: 要注意,Cookie的内容会被保存在客户端,对于敏感信息应避免存储过于详细的数据,以防泄露。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值