存储来自不同用户的Java HttpSession并使其无效
好的。我想做的是,当我更新用户时,能够使他们当前拥有的任何会话无效,以便强制刷新凭据。我不在乎能否直接访问特定于会话的用户数据。理想情况下,我还可以通过类似的方式将用户限制为一个会话 我尝试的是使用用户名作为键,HttpSession作为值创建一个HashMap(我的实际设置稍微复杂一些,但在多次看似无法解释的失败之后,我将其归结为这个简单的测试)。但是,每当我试图告诉检索到的HttpSession使其无效时,它似乎使当前[admin]会话无效。HttpSession是否不可避免地绑定到当前请求 还是有一种完全不同的处理方式存储来自不同用户的Java HttpSession并使其无效,java,session,jetty,invalidation,httpsession,Java,Session,Jetty,Invalidation,Httpsession,好的。我想做的是,当我更新用户时,能够使他们当前拥有的任何会话无效,以便强制刷新凭据。我不在乎能否直接访问特定于会话的用户数据。理想情况下,我还可以通过类似的方式将用户限制为一个会话 我尝试的是使用用户名作为键,HttpSession作为值创建一个HashMap(我的实际设置稍微复杂一些,但在多次看似无法解释的失败之后,我将其归结为这个简单的测试)。但是,每当我试图告诉检索到的HttpSession使其无效时,它似乎使当前[admin]会话无效。HttpSession是否不可避免地绑定到当前请求
如果碰巧有问题,我使用的是Jetty 6.1.26。没有直截了当的方法。我能想到的最简单的方法是在数据库(或cahche)上保留一个标志,并在每个请求上检查它的有效性 或者,您可以实现HTTP会话侦听器,并保留可访问和无效的用户会话的哈希映射
我还没有尝试过这些,所以我不知道有任何性能问题。但对于大多数应用来说,它应该是可以接受的。没有直接的方法。我能想到的最简单的方法是在数据库(或cahche)上保留一个标志,并在每个请求上检查它的有效性 或者,您可以实现HTTP会话侦听器,并保留可访问和无效的用户会话的哈希映射
我还没有尝试过这些,所以我不知道有任何性能问题。但对于大多数应用程序来说,它应该是可以接受的。好吧,据我所知,这是没有办法的。使用请求范围的bean并没有像我预期的那样工作(尽管它确实让我很好地了解了Spring是如何运行的,拦截字段访问)。最后,我在SessionHandler(会话作用域bean)上使用了一个脏标志,并进行了高优先级的方面检查,如有必要,在用户的下一个请求中对会话调用invalidate()。我仍然让我所有的SessionHandlers注册到SessionManager,并使用@PreDestroy方法注销它们,以避免映射中出现大量空条目。好吧,据我所知,这是没有办法的。使用请求范围的bean并没有像我预期的那样工作(尽管它确实让我很好地了解了Spring是如何运行的,拦截字段访问)。最后,我在SessionHandler(会话作用域bean)上使用了一个脏标志,并进行了高优先级的方面检查,如有必要,在用户的下一个请求中对会话调用invalidate()。我仍然让我所有的SessionHandlers注册到SessionManager,并使用@PreDestroy方法注销它们,以避免映射中出现大量空条目。这几乎就是我的设置(会话侦听器)。问题是在调用session.invalidate()时,它使我从中失效的会话失效,而不是目标会话。我的想法是在会话范围的bean中设置一个无效标志,然后使用一个方面来验证和失效。或者我想我可以从请求范围的bean进行验证。无论哪种方式,它都会把我带到同一个地方(取决于方面还是实例化是先发生的)。当您在该映射的其他用户的会话上调用invalidate时,您是唯一一个无效的?也许你的会话在地图上,它也无效了……是的。目标会话未受影响。这几乎正是我的设置(会话侦听器)。问题是在调用session.invalidate()时,它使我从中失效的会话失效,而不是目标会话。我的想法是在会话范围的bean中设置一个无效标志,然后使用一个方面来验证和失效。或者我想我可以从请求范围的bean进行验证。无论哪种方式,它都会把我带到同一个地方(取决于方面还是实例化是先发生的)。当您在该映射的其他用户的会话上调用invalidate时,您是唯一一个无效的?也许你的会话在地图上,它也无效了……是的。目标会话未受影响。