微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何实现过滤器每个会话只执行一次用户更新?

如何解决如何实现过滤器每个会话只执行一次用户更新?

环境:

  • Jboss 7.2
  • Java 11
  • 休眠 5+

我有一个过滤器,每次用户登录时,我都会更新访问时间和子表(User -> UserRol)中的任何角色更改。

我遇到的问题是函数 userSvc.trace() 在每个会话中执行不止一次,并且会引发 OptimisticLockingExcpetion。

是否可以在过滤器中每个会话只执行一次用户更新?

并行任务

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。