Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Spring/AJAX基于另一种方法在Spring中使会话无效_Java_Ajax_Spring_Spring Mvc_Session - Fatal编程技术网

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

Java 如何使用Spring/AJAX基于另一种方法在Spring中使会话无效,java,ajax,spring,spring-mvc,session,Java,Ajax,Spring,Spring Mvc,Session,因此,场景是:用户A使用凭据X登录并在系统中工作。用户B也是A的朋友,希望使用相同的凭据登录。根据要求,我们将显示一个警报,表示某些用户已使用相同的id登录,您希望通过终止该会话继续 如果用户B同意,我们需要将用户A踢出系统。现在,我想实现的是,一旦调用killSession()方法(在Spring Controller中),我必须向用户a的浏览器客户端发送推送通知,并将其从系统中注销 我不想通过设置超时来实现这一点。我想从服务器触发它,所以它不会创建很多HTTP请求来知道他的会话是否处于活动状

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

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

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


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

我们也面临类似的问题,为了解决它,我们将tomcat会话存储在redis中。 tomcat中需要的配置 context.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"/>

其中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();
URL=新URL(“http://172.16.213.158:81/);
InputStream InputStream=url.openStream();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(inputStream));
rd.readLine();
rd.close();

其中172.16.213.158:81是节点服务器

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

我们不能使用旧会话。invalidate()吗用户A的唯一会话ID上的方法?@AbhinabKanrar我想你不明白。我们可以通过这种方式终止会话,但我想向用户A的客户端发送一个通知,以便它可以开始使会话无效。这是你自己发明的还是使用Spring安全性?因为它支持所有这些现成的功能。我正在这样做这是我自己做的,因为spring security被客户拒绝了。所以我必须通过反复试验来完成,这就是我现在结束的地方!虽然我很喜欢你的想法,但客户的大问题是不使用Redis或任何类型的磁盘存储!所以这是不可能的。大气怎么样?我们可以用它吗?如果我没有错,大气是sa我是faye。你可以使用任何东西。如果你不想使用redis,没问题,只需从tomcat服务器上为该用户删除JSSessionID。问这个我觉得很傻,但我可以知道你从tomcat上删除JSSessionID是什么意思吗?(以前从未这样做过)如果你已经知道了,你能告诉我怎么做吗?听起来很简单。好吧,我使用了DB,因为redis是不允许的。无论如何,我接受了你的答案,因为这是最接近我问题的答案!谢谢你的帮助。谢谢你的关心,但我对此无能为力!因为它使用RAM来处理数据比磁盘更安全。但我仍然在研究MongoDB,看看它是否适合这个用例。感谢您的回复。假设我们有触发器,它监视用户会话历史记录表,一旦用户B同意终止会话,我们将更新该表中的一些值。现在,用户A的连接如何知道注销系统,这是我的问题。这不是关于如何使会话无效,而是如何在不使用setInterval或setTimeout的情况下实现会话。我的第一个想法是,您可以让Spring调度程序每隔几分钟运行一次,并在DB中检查该值。但是对于许多用户(超过10000个)这可能是一个有点过于繁重的过程。这是我从朋友那里得到的第一个建议,但我不会这样做。调度程序不应该这样做,我们有工具来实现这一点。所以我刚开始搜索,现在我在这里寻求帮助!:)
 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();