将多个cookie合并为一个

时间:2013-09-06 06:40:03

标签: servlets cookies servlet-filters

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

但是如果客户拥有非常冗长的私钥和证书,那么生成的SAML令牌将超出cookie可以处理的大小,因此cookie会超过4K限制而丢弃值。

我们认为的方法是将cookie分解为多个cookie,以便一个人破解SAML令牌,其他cookie将保存用户信息等。 这样做并不是什么大问题,因为我们只需要创建多个cookie。

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

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

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

1 个答案:

答案 0 :(得分:2)

您确实可以使用自定义实现来装饰/包装HttpServletRequest#getCookies(),该实现返回具有所需cookie的数组。您可以借助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的帮助下以相同的方式执行此操作。