系统中有一些值使用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=]", ""); }
备注: