Http 使用Java在cookie中存储压缩的JWT

Http 使用Java在cookie中存储压缩的JWT,http,servlets,cookies,jwt,Http,Servlets,Cookies,Jwt,我使用JavaServlet将带有JWT信息的cookie返回给客户端 我还了两块饼干 1=>Token\u id,此cookie存储id\u令牌 2=>refresh_令牌,此令牌存储令牌过期时要发送的刷新令牌 问题是,这些信息太大,因此浏览器会发送以下错误: 431(请求标头字段太大) 为了解决这个问题,我想将refresh_令牌存储为压缩的,当我使用这个信息时,我会解压缩 我阅读了有关压缩的内容,并尝试使用GZIPCompress字符串,如下所示: public static Strin

我使用JavaServlet将带有JWT信息的cookie返回给客户端

我还了两块饼干

1=>Token\u id,此cookie存储id\u令牌

2=>refresh_令牌,此令牌存储令牌过期时要发送的刷新令牌

问题是,这些信息太大,因此浏览器会发送以下错误:

431(请求标头字段太大)

为了解决这个问题,我想将refresh_令牌存储为压缩的,当我使用这个信息时,我会解压缩

我阅读了有关压缩的内容,并尝试使用GZIPCompress字符串,如下所示:

 public static String compress(final String str) throws IOException {
        if ((str == null) || (str.length() == 0)) {
            return null;
        }
        ByteArrayOutputStream obj = new ByteArrayOutputStream();
        GZIPOutputStream gzip = new GZIPOutputStream(obj);
        gzip.write(str.getBytes("UTF-8"));
        gzip.flush();
        gzip.close();
        return obj.toString();
    }
当我将压缩字符串添加到cookie时,出现以下异常:

Illegal character in cookie value
我无法在服务器中存储刷新令牌。
如何压缩一个大字符串以存储在cookie中?我需要减小值cookie的大小。

cookie只能存储字符串,但您正在存储二进制数据

压缩过程的结果是二进制的,即使调用
obj.toString(),也不能用字符串表示。您需要将结果编码为base64,以获得可以存储在cookie中的字符串,但是base64会将大小增加约30%,因此我不知道这在您的情况下是否有意义

 //storage
 cookie = base64(gzip(str))

 //retrieval
 str = gunzip(base64decode(cookie))

刷新令牌通常包含在随机字符串中。可能是您包含的数据太多了

是的@pedrofb,我的数据太大了。我想压缩字符串的大小,但我知道我需要在cookie文件中存储一个字符串。你知道有没有什么方法可以将长字符串改为短字符串,并将其改为原始字符串?大多数浏览器支持最多4096字节的cookie。不算太多。我建议您使用localStorage而不是Cookie,根据浏览器的不同,您将拥有5到10 mb的空间。您可能不需要压缩已使用的localStorage,我不会关闭该主题,因为它的主要主题是减小字符串的大小。