从 doFilter 方法设置 cookie
Posted
技术标签:
【中文标题】从 doFilter 方法设置 cookie【英文标题】:Setting cookie from doFilter method 【发布时间】:2013-01-12 00:43:00 【问题描述】:我有一个带有 doFilter 方法的过滤器类。在doFilter方法中,我设置了一个cookie如下
HttpServletResponse httpResp=(HttpServletResponse)servletResponse;
Cookie myCookie=new Cookie("test","");
myCookie.setValue("testValue");
myCookie.setPath("/");
myCookie.setDomain(".mydomain.com");
httpResp.addCookie(myCookie);
filterChain.doFilter(servletRequest,servletResponse);
这在理想情况下应该可行吗?在 httpResp(HttpServletResponse) 对象中设置一个 cookie,然后只转发 servletResponse(ServletResponse) 对象
奇怪的是,cookie 是为某些客户端设置的,但对于其他一些客户端,cookie 没有设置。我已经检查了客户端浏览器上的 cookie 设置,看起来没问题。
【问题讨论】:
代码看起来不错。问题是在其他地方引起的。例如。链中的response.reset()
将清除所有标题(因此也清除之前设置的所有cookie)。运行调试器来确定原因。至少,如果手头没有 SSCCE,就无法可靠地回答这个问题。
没有其他过滤器。该链结束于一个 servlet,它简单地将相同的请求和响应转发给 JSP。所以它是这样的。 doFilter->Servlet->转发到JSP。标题丢失的任何可能性??
好吧,如前所述,到目前为止发布的代码中看不到问题。是其他地方造成的。例如。响应重置、URL 中的域错误、cookie 值不兼容、方案更改、代理不良等……等等……有太多可能的原因,如果没有 SSCCE,就无法回答。
【参考方案1】:
您可以使用 HttpServletResponseWrapper 启用过滤器来控制下游过滤器或 servlet 的响应
https://docs.oracle.com/javaee/7/api/javax/servlet/http/HttpServletResponseWrapper.html
这里是对包装器的一个很好的解释:https://***.com/a/7047298/1676293
【讨论】:
【参考方案2】:这将起作用,除非您需要将代码重构为:
filterChain.doFilter(servletRequest,servletResponse);
HttpServletResponse httpResp=(HttpServletResponse)servletResponse;
Cookie myCookie=new Cookie("test","");
myCookie.setValue("testValue");
myCookie.setPath("/");
myCookie.setDomain(".mydomain.com");
httpResp.addCookie(myCookie);
在 filterChain 调用之后添加 cookie,以便另一个过滤器/servlet 无法执行冲突。
【讨论】:
不好的建议。在那个时候提交响应的机会非常大(这通常在写入内容超过 2KB 时自动发生,具体取决于服务器配置)。您需要在响应提交之前设置响应标头。 我不同意。我认为这是上下文相关的。您的观点是有效的,但取决于应用程序。我的观点是有效的,取决于应用程序。 您的回答并未涵盖您需要破解/更改 web 应用程序的配置/代码以使响应缓冲区大小无限,并且在所有过滤器完成之前永远不会刷新。即便如此,这仍然是一个糟糕的建议。您应该回答解决方案,而不是解决方法/黑客。 不好的建议。在 doFilter 之后设置 cookie 不起作用。以上是关于从 doFilter 方法设置 cookie的主要内容,如果未能解决你的问题,请参考以下文章
为啥 php curl 不在我的 cookiefile 中保存 cookie?
doFilter() 重写方法 httpRequest.getUserPrincipal() 总是返回 NullPoint 异常