关闭应用程序(即所有打开的窗口)时注册用户注销时间

问题描述 投票:0回答:0

我需要注册用户从我的 JEE Web 应用程序注销的时间,可以手动使用注销按钮,也可以关闭用户打开的所有窗口(浏览器)。

登录/注销使用 CDI 会话 bean 进行管理。

这是我到目前为止所尝试的:

  1. 使用 javascript“beforeUnloadEvent”调用 ajax 请求(我的应用程序中的一个 servlet)来注册用户注销,但在每个选项卡/浏览器关闭时都会触发此事件。这不适合我的情况。
     $(window).on('beforeUnloadEvent', function() {
        $.ajax({
           url: '/registerlogout',
           type: 'POST'
          });
        });
  1. 我还尝试在我的bean LoginController 中对“@PreDestroy”方法执行注册,但是直到web.xml 中定义的“session-timeout”过期时才调用该方法。而用户可能早就注销了。
    @Named
    @SessionScoped
    public class LoginController implements Serializable{
       public void login(){
          ...
          saveUserLoginTime();
          ...
       } 
       public void logout(){
          ...
          saveUserLogoutTime();
          ...
       }
       @Predestroy
       public void onclose(){
         saveUserLogoutTime();
       }
    }
  1. 我在 template.js 中创建了一个网络套接字,并试图从它的“onclose”事件中受益,但这也适用于每个选项卡关闭。
function createWebSocket() {
  var socket = new WebSocket('wss://your-websocket-url');
  
  socket.onopen = function() {
    console.log('WebSocket connection established.');
    // Perform any necessary actions when the connection is opened
  };
  
  socket.onclose = function(event) {
    console.log('WebSocket connection closed with code: ' + event.code);
    handleWebSocketClose();
  };
 
}

function handleWebSocketClose() {
  //ajax call to register userlogouttime
}

createWebSocket();
  1. 我定义了一个实现HttpSessionListener的@WebListener,但是这个监听器是针对所有应用程序的,我无法区分LoginController和其他的。
@WebListener
public class SessionListener implements HttpSessionListener{
    @Override
    public void sessionCreated(HttpSessionEvent e){
     ...
    }

    @Override
    public void sessionClosed(HttpSessionEvent e){
     System.out.println("Session close: " + e.getSession().getId());
    }
}

我认为解决方案可能是某种捕捉会话结束事件或类似的东西。这样的事件类似于用 HttpSessionListener 触发的会话销毁。我没有想法,希望你能帮忙。

jsf monitoring logout
© www.soinside.com 2019 - 2024. All rights reserved.