在 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 中设置后,表名也不会改变?

在 Appdelegate 中设置后如何更改导航栏的色调?

UITableViewCell 颜色在我在他的班级中设置后不会保持不变

Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了

Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了

Mac上鼠标滚轮方向是和Win相反的,系统中设置后触摸板的方向又跟着变了