#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();
...
}