Хотите создать фильтр для проверки на cookie, затем сохранить объект и ссылку с контроллеров - PullRequest
7 голосов
/ 09 февраля 2012

Я хочу создать фильтр, который будет выполняться перед любым из моих действий контроллера весны mvc.

Я хочу проверить наличие файла cookie, а затем сохранить объект где-нибудь для текущего только запрос.

Затем мне нужно сослаться на этот объект (если он существует) из действия моего контроллера.

Предложения о том, как это сделать?

Ответы [ 2 ]

14 голосов
/ 09 февраля 2012

для создания фильтра просто создайте класс, который реализует 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>
    <filter-name>CookieFilter</filter-name>
    <filter-class>
        my.package.CookieFilter
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>CookieFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

на этом этапе вашего контроллера просто проверьте, существует ли attibute в запросе, используя request.getAttribute ("myCoolObject")

0 голосов
/ 20 июля 2018

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<Cookie> 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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...