有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何基于使用Spring/AJAX的另一种方法在Spring中使会话无效

因此,场景是:用户A使用凭据X登录并在系统中工作。用户B也是A的朋友,希望使用相同的凭据登录。根据要求,我们将显示一个警报,表示某些用户已使用相同的id登录,您希望通过终止该会话继续

如果用户B同意,我们需要将用户A踢出系统。现在,我想实现的是,一旦调用killSession()方法(在Spring Controller中),我必须向用户a的浏览器客户端发送推送通知,并将其从系统中注销

我不想通过设置超时来实现这一点。我想从服务器触发它,所以它不会创建很多HTTP请求来知道他的会话是否处于活动状态

你们能帮我用什么样的框架或库来实现这一点吗。我对此有点陌生,我所做的只是尝试了SockJS和Socket。但是没有任何成功,因为我不了解如何做到这一点。谢谢你们的帮助


共 (2) 个答案

  1. # 1 楼答案

    在用户对象中取一个额外的字段,例如isLoggedIn作为boolean字段,并将其设置为true,直到用户登录。一旦用户注销,将其设置为false。对于会话到期时间也需要这样做。一旦会话过期,应使用触发器或通过存储过程调用自动将此字段设置为false。 然后,在登录控制器中,您可以简单地添加一点逻辑,它将检查是否有与用户a的会话,为用户B提问,然后完成您的工作。 希望有帮助

  2. # 2 楼答案

    我们也面临类似的问题,为了解决这个问题,我们将tomcat会话存储在redis中。 tomcat中需要的配置 上下文xml

    <!  Default set of monitored resources  >
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
         host="172.16.1.167"
         port="6379"
         database="0"
         maxInactiveInterval="1440"
         sessionPersistPolicies="ALWAYS_SAVE_AFTER_REQUEST"/>
    

    在您的代码中,您可以删除会话,如下所示:

    LOGGER.info("Invalidating previous session for agent: " + agentId);
    String sessionId = null;
    if (cacheService.getValue(agentId + "_session") != null)
      sessionId = (String) cacheService.getValue(agentId + "_session");
    cacheService.deleteValue(agentId + "_session");
    cacheService.deleteValue(sessionId + "_session");
    if (cacheService.getValue(sessionId) != null) {
      LOGGER.info("Session invalidated from redis for agent: " + agentId);
      cacheService.deleteValue(sessionId);
    } else {
      LOGGER.info("Agent session not found in redis sessions for agent: " + agentId);
    }
    

    其中cacheService只是Redis模板。之后,你可以使用faye推送消息

     URL url = new URL("http://172.16.213.158:81/<your-data>);
      InputStream inputStream = url.openStream();
      BufferedReader rd = new BufferedReader(new InputStreamReader(inputStream));
      rd.readLine();
      rd.close();
    

    其中172.16.213.158:81是节点服务器