在我们的应用程序中,我们使用cookie来设置经过身份验证的SAML令牌和其他信息。 这种方法适用于几乎所有场景。
但是如果客户拥有非常冗长的私钥和证书,那么生成的SAML令牌将超出cookie可以处理的大小,因此cookie会超过4K限制而丢弃值。
我们认为的方法是将cookie分解为多个cookie,以便一个人破解SAML令牌,其他cookie将保存用户信息等。 这样做并不是什么大问题,因为我们只需要创建多个cookie。
但故事中的转折就在这里,我们的应用程序使用一个框架,该框架期望具有特定名称的cookie以及在其中设置的所有值。 当我们想要将值分解为多个cookie时,进一步的请求会失败。
我想过一个过滤器,它会拦截所有请求,并将多个cookie值合并为一个,并按预期将其提供给框架。
答案 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
的帮助下以相同的方式执行此操作。