问题描述
在认证中心登出后,调用各个Web应用的登出接口,清除登出用户的session。问题是:如何调用,才能让Web应用知道清除哪个sessionid的session信息呢?用是在每次创建session的时候保存到一个映射里面,id为用户的标示,然后收到退出消息的时候,找到该用户id对应的HttpSession,然后validate?我怎么觉得这是我们自己调用的销毁HttpSession副本,而不是Web服务器内存里的session销毁呢?用Web Service和直接调用url接口其实是一样的,本质问题是如何让接口完成消除特定用户的session的问题。求指教。。。 问题补充:首先感谢您的回答。道理我明白,但是如何根据jsessionid去让它代表的session失效呢?Servlet没有相关API,只能得到request的session的id,去操作该session里的属性。我们现在是通过认证中心去调用各个Web的logout,不是用户通过浏览器去request,所以无法得到具体的session啊。jsessionid可以得到,但是如何得到它代表的session进而去valiate这个才是关键。请指教,歇息了。langshao 写道
解决方案
引用jsessionid可以得到,但是如何得到它代表的session进而去valiate这个才是关键。直接将jsessionid作为key,HttpSession作为value,存到一个Map中(注意要是线程安全的,不要序列化它,就一直在内存中)。取这个HttpSession出来invalidate()就行了。
解决方案二:
引用是在每次创建session的时候保存到一个映射里面,id为用户的标示,然后收到退出消息的时候,找到该用户id对应的HttpSession,然后validate?我怎么觉得这是我们自己调用的销毁HttpSession副本,而不是Web服务器内存里的session销毁呢?这种方法也可以吧, 怎么会是副本呢? 你记录下的只是 HttpSession 的引用,其实是指向同一个对象啊。
解决方案三:
可以这样做:1. 用户在认证中心登录时,将用户名传到Web应用,Web应用自动认相应的用户登录,同时记下用户名和jsessionid。2. 用户在认证中心退出时,将用户名传到Web应用,Web应用找到相应的jsessionid,将此jsessionid标记为已退出。3. Web应用再加一个Filter,在每一个请求之前先检查这个jsessionid是否已退出。