替换HttpServletResponse中的特定“ Set-Cookie”标题

时间:2019-06-05 10:22:06

标签: spring http java-ee cookies

ZAP security tool最近添加了一项功能,该功能可以检查所有cookie是否应包含值为“ lax”或“ strict”的“ SameSite”属性。 Cookie的Java EE API尚不支持此属性。因此,如果要设置它,则必须通过操纵Set-Cookie的相应HttpServletResponse标题来手动进行设置。

我正在尝试针对非常具体的Cookie进行此操作,该Cookie的创建是将其添加到我无法控制的响应中。因此,我添加了一个过滤器,该过滤器应通过简单地添加SameSite=lax属性来更正此cookie。但是,我不知道如何处理正在处理的Set-Cookie对象中存在多个HttpServletResponse标头的可能性。找到合适的一个不是问题,因为我可以在HttpServletResponse::getHeaders(String)返回的值中搜索所需的cookie名称(或者甚至更容易使用getCookie()等API)。

但是将标头重新设置为响应并替换旧的响应是一个问题。 HttpServletResponse::setHeader(String)的文档说,如果已有的标头名称相同但值不同,它将替换现有的标头。 但是,如果响应包含多个Set-Cookie标头,这是完全合法的,那么我认为setHeader-call最终替换掉将是不确定的结果(因为所有现有的Set-Cookie标头都将是根据我对文档的理解,有可能需要替换。那是正确的吗?如果是这样,我该怎么做才能替换正确的标头?

我唯一能想到的解决方法是改用addHeader。从理论上讲,浏览器应该用彼此相同的名称和标识符(以及路径和域)替换cookie,因此,当响应中有多个cookie标头时,他应该使用最后一个。 但是,这需要保证addHeader()将附加在末尾,并且此顺序在返回浏览器的过程中永远不会更改/更改-我怀疑此承诺是否足够稳定才能建立。

0 个答案:

没有答案