在 doFilter 中设置后获取 Cookie
Posted
技术标签:
【中文标题】在 doFilter 中设置后获取 Cookie【英文标题】:Get Cookie after its set in doFilter 【发布时间】:2022-01-20 10:06:46 【问题描述】:我有一个 CookieFilter 类,它覆盖 doFilter 方法以在调用我的 Rest 服务之前设置 Cookie:
import javax.servlet.*;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
public class CookieFilter implements Filter
@Override
public void init(FilterConfig config) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
if (notPresent("TEST"))
String uuid = UUID.randomUUID().toString();
httpResponse.addCookie(new Cookie("TEST", uuid));
chain.doFilter(request, response);
@Override
public void destroy()
private boolean notPresent(String cookieName)
// here are the checks
休息服务方式:
void myRestServiceMethod(@Context HttpServletRequest request)
Cookie[] cookies = request.getCookies(); // has my cookie inside after second call
// other logic bellow
myRestServiceMethod 在 doFilter 之后被调用,但 Cookie 不存在。
但是,我能够在对 myRestServiceMethod 的第二次客户端调用中读取 cookie(使用 JAX-RS @Context 检索 HttpServletRequest 对象),其中 Cookie(在第一次调用中设置)从客户端发送并传递到服务器。
我的问题是:有没有办法在 doFilter 中设置后第一次调用 myRestServiceMethod 时读取 Cookie?
【问题讨论】:
【参考方案1】:有没有办法在 doFilter 中设置后第一次调用 myRestServiceMethod 时读取 Cookie?
没有。
有两种解决方案:
添加cookie后刷新请求。
if (notPresent("TEST"))
String uuid = UUID.randomUUID().toString();
httpResponse.addCookie(new Cookie("TEST", uuid));
httpRequest.sendRedirect(httpRequest.getRequestURI()); // NOTE: you might want to add query string if necessary.
else
chain.doFilter(request, response);
或者,最好将其存储为请求属性。
String uuid = getCookieValue("TEST");
if (uuid == null)
uuid = UUID.randomUUID().toString();
httpResponse.addCookie(new Cookie("TEST", uuid));
request.setAttribute("TEST", uuid);
chain.doFilter(request, response);
这样你就可以简单地做到这一点。
String uuid = (String) request.getAttribute("TEST");
如果 CDI 在环境中可用,则可以改为填充 @RequestScoped
bean。
也就是说,让 JAX-RS 服务(间接)处理 cookie 很奇怪。 REST 从不打算成为有状态的。
【讨论】:
以上是关于在 doFilter 中设置后获取 Cookie的主要内容,如果未能解决你的问题,请参考以下文章
即使在 Laravel eloquent 中设置后,表名也不会改变?
UITableViewCell 颜色在我在他的班级中设置后不会保持不变
Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了