gpt4 book ai didi

Java JSP过滤器,如果不存在则设置cookie

转载 作者:行者123 更新时间:2023-12-02 11:29:06 25 4
gpt4 key购买 nike

我的问题是:如何通过过滤器设置尚不存在的 cookie?

根据我了解过滤器的工作原理,我可以在传入请求到达给定的 servlet 之前捕获该请求,处理该请求并将其传递给 servlet。当 servlet 生成响应时,我可以捕获传出响应并再次使用它。

enter image description here

我所做的是根据请求确定特定的 cookie 不存在,因此我设置了一个 boolean 值来表示这一点。当响应从 servlet 返回时,我添加特定的 cookie。

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
ServletContext sc = filterConfig.getServletContext();

//Run when receiving the request from the client
boolean cookie = false;

System.out.println("Searching for the cookie (request)");//debug
Cookie[] cookies = httpRequest.getCookies();
if(cookies != null) {
for(int a = 0; a < cookies.length; a++) {
if(cookies[a].getName().equals("PositionCookie")) {
cookie = true;
}
}
}

chain.doFilter(httpRequest, httpResponse);

//Run when sending the response to the client
System.out.println("Determining to create cookie (response)");//Debug
if(!cookie) {
System.out.println("Creating 'PositionCookie' (response)");//debug
Cookie c = new Cookie("PositionCookie", "/test/data/string");
c.setPath("/");
c.setMaxAge(-1);
httpResponse.addCookie(c);
}
}

因为我只是希望这是一个 session cookie,所以我将它的 MaxAge 设置为 -1。所有调试行均已激活并写入 catalina.out,因此我知道已达到新的 Cookie 语句,但新的 cookie 未添加到浏览器保存的 cookie 中。我没有任何拒绝新 cookie 的浏览器设置,并且我毫无问题地获得了 JSESSIONID cookie。

最佳答案

Cookie 设置在 HTTP header 中。 header 是作为响应的一部分写入的第一个内容。 Servlet 容器在将响应(首先是 header )写入客户端之前仅缓冲如此多的响应。一旦 header 被写入,响应就被视为已提交。 (应用程序还可以强制提交响应。)提交响应后就无法添加 cookie(因为 HTTP header 已发送到客户端)。

我强烈怀疑响应是在您尝试添加 cookie 时提交的,因此调用会被忽略。

简单的解决方案是将对 addCookie() 的调用移至对 chain.doFilter(httpRequest, httpResponse); 的调用之前

关于Java JSP过滤器,如果不存在则设置cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49414601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com