Как добиться того, чтобы фильтр выполнял обновление пользователя только один раз за сеанс?

#java #authentication #filter #optimistic-locking

Вопрос:

Окружающая среда:

  • Jboss 7.2
  • Java 11
  • Спящий режим 5

У меня есть фильтр, в котором каждый раз, когда пользователь входит в систему, я обновляю время доступа и любые изменения ролей в подтаблице (Пользователь -> Имя пользователя).

Проблема, которую я получаю, заключается в том, что функция userSvc.trace() выполняется более одного раза за сеанс, и это вызывает оптимистическое блокирование.

Есть ли способ выполнить обновление пользователя только один раз за сеанс в фильтре?

Задачи параллельно

 10:54:33,091 INFO  [stdout] (default task-2) -----------> session_id:XWoEjqbh1qII8g_dy4jAu4Xt4umYfQc0NpIt56gs
10:54:34,267 INFO  [stdout] (default task-3) ----------->session_id:XWoEjqbh1qII8g_dy4jAu4Xt4umYfQc0NpIt56gs
10:54:34,269 INFO  [stdout] (default task-1) ----------->session_id:XWoEjqbh1qII8g_dy4jAu4Xt4umYfQc0NpIt56gs
 

Фильтр

 @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws java.io.IOException {

        req.setCharacterEncoding(UTF8);
        resp.setCharacterEncoding(UTF8);

        HttpServletRequest sReq = (HttpServletRequest) req;
        HttpSession session = sReq.getSession(false);
        boolean isLoggedIn = (session != null amp;amp; session.getAttribute(USER) != null);

        try {
            if (!isLoggedIn) {
                User user = usuariSvc.trace(uPrincipal); //uPrincipal loaded with req data

                sReq.getSession().setAttribute(USER, user);
            } else {
                chain.doFilter(req, resp);
            }
        } catch (Exception e) {
            log.error("Error doFilter "   e.getMessage(), e);
        }

    }
 

Обслуживание пользователей

 @Stateless
public class UserService {
    ...
    public User trace(UserPrincipal uPrincipal) throws AppException {
        ...
        updateRols(usuari, uPrincipal);
        em.flush();
        ...
    }