想要创建一个filter来检查cookie,然后从控制器保存对象和引用

我想创建一个在我的任何spring mvc控制器操作之前执行的filter。

我想检查cookie的存在,然后只为当前请求存储一个对象。

然后我需要从我的控制器动作中引用这个对象(如果它存在)。

关于如何做到这一点的建议?

创建filter只是创建一个实现javax.servlet.Filter的类,在你的情况下可以是这样的

public class CookieFilter implements Filter {     public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {         HttpServletRequest request = (HttpServletRequest) req;  Cookie[] cookies = request.getCookies(); if (cookies != null){ for (Cookie ck : cookies) { if ("nameOfMyCookie".equals(ck.getName())) { // read the cookie etc, etc // .... // set an object in the current request request.setAttribute("myCoolObject", myObject) } }         chain.doFilter(request, res);     }     public void init(FilterConfig config) throws ServletException { // some initialization code called when the filter is loaded     }     public void destroy() { // executed when the filter is unloaded     } } 

然后在web.xml中声明filter

     CookieFilter            my.package.CookieFilter          CookieFilter    /*  

在控制器的这一点上,使用request.getAttribute(“myCoolObject”)检查请求中是否存在attibute

Java 8的方法是使用流来过滤所需的cookie,然后根据所需的逻辑使用它:

 public class CookieFilter implements GenericFilterBean { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; Cookie[] cookies = request.getCookies(); Stream stream = Objects.nonNull(cookies) ? Arrays.stream(cookies) : Stream.empty(); String cookieValue = stream.filter(cookie -> "nameOfMyCookie".equals(cookie.getName())) .findFirst() .orElse(new Cookie("nameOfMyCookie", null)) .getValue(); if (Objects.nonNull(cookieValue)) { request.setAttribute("myCoolObject", myObject); } chain.doFilter(request, res); }