Servlets 将多个cookie合并为一个cookie

Servlets 将多个cookie合并为一个cookie,servlets,cookies,servlet-filters,Servlets,Cookies,Servlet Filters,在我们的应用程序中,我们使用cookies来设置经过身份验证的SAML令牌和其他信息。 这种方法几乎适用于所有场景 但是,如果客户拥有非常长的私钥和证书,则生成的SAML令牌超出了cookie可以处理的大小,因此cookie会在超过4K限制时删除这些值 我们认为的方法是将cookie分解为多个cookie,这样一个cookie将插入SAML令牌,其他cookie将保存用户信息等等。 这样做没什么大不了的,因为我们只需要创建多个cookie 但故事的转折点就在这里,我们的应用程序使用一个框架,该框

在我们的应用程序中,我们使用cookies来设置经过身份验证的SAML令牌和其他信息。 这种方法几乎适用于所有场景

但是,如果客户拥有非常长的私钥和证书,则生成的SAML令牌超出了cookie可以处理的大小,因此cookie会在超过4K限制时删除这些值

我们认为的方法是将cookie分解为多个cookie,这样一个cookie将插入SAML令牌,其他cookie将保存用户信息等等。 这样做没什么大不了的,因为我们只需要创建多个cookie

但故事的转折点就在这里,我们的应用程序使用一个框架,该框架要求cookie具有特定的名称和其中设置的所有值。 当我们想到将这些值分成多个cookie时,进一步的请求就会失败

我想有一个过滤器,它将拦截所有请求,并将多个cookie值合并为一个,并按预期将其提供给框架

  • 这是正确的方法吗
  • 如果是这样的话,是否有任何实用程序可以将cookie合并成一个cookie并将其设置回请求,以便框架可以继续处理该请求

您确实可以使用一个自定义实现来装饰/包装
HttpServletRequest#getCookies()
,该实现返回一个包含所需cookies的数组。您可以在
HttpServletRequestWrapper
的帮助下执行此操作

基本上,它在过滤器中应该是这样的:

chain.doFilter(new HttpServletRequestWrapper(request) {
    @Override
    public Cookie[] getCookies() {
        Cookie[] originalCookies = super.getCookies();

        // Loop, check, merge, create new Cookie[].
        // ...

        return newCookies;
    }
}, response);
您甚至可以对
HttpServletResponse#addCookie()
执行相同的操作,以便自动捕获和拆分具有长值的cookie。您可以使用
HttpServletResponseWrapper
以同样的方式进行此操作