Java 如何查找给定HTTP会话所属的用户 简介:

Java 如何查找给定HTTP会话所属的用户 简介:,java,session,tomcat,servlets,jira,Java,Session,Tomcat,Servlets,Jira,我有一个JIRA实例,许多外部工具通过REST使用它。其中一些工具不重用它们创建的HTTP会话,这会导致为每个请求创建一个新会话 问题: 创建太多会话会导致不可接受的资源消耗。因此,我正在寻找一种方法: 通过拒绝登录尝试,限制行为不端的客户端不创建太多会话,从而迫使其所有者修复其客户端 使旧会话无效,从而释放服务器上的资源 但是为了做到这一点,我需要知道给定的用户会话属于哪个会话,,因此,当用户X达到5个会话的限制时,我可以使他以前的会话无效,或者拒绝他的请求 问题: 如何将会话映射到Htt

我有一个JIRA实例,许多外部工具通过REST使用它。其中一些工具不重用它们创建的HTTP会话,这会导致为每个请求创建一个新会话

问题: 创建太多会话会导致不可接受的资源消耗。因此,我正在寻找一种方法:

  • 通过拒绝登录尝试,限制行为不端的客户端不创建太多会话,从而迫使其所有者修复其客户端

  • 使旧会话无效,从而释放服务器上的资源

但是为了做到这一点,我需要知道给定的用户会话属于哪个会话,,因此,当用户X达到5个会话的限制时,我可以使他以前的会话无效,或者拒绝他的请求

问题: 如何将会话映射到
HttpSessionListener
中的用户? 有没有更好的方法来实现我的目标?可能是JIRA特定的东西?

会话通常通过使用会话cookie“保存”。如果客户端没有在收到cookie时提取cookie,或者没有将其包含在后续请求中,那么您将拥有您描述的场景。如果没有包含cookie,则没有确定的方法将第二个请求链接到第一个请求

Jira会为这些请求创建一个会话,这听起来有点奇怪。如果它们真的是REST,那么它们将是无状态的,不需要任何会话状态。虽然我对Jira的安装一无所知,但我会先检查一下

无论如何,我可以想出一些方法来缩小“坏”客户的范围。一种是检查导致新会话的传入请求中的“用户代理”头。您可能会发现一种模式,即用户代理会导致更多的新会话,而用户代理不会。这可能是一个选项,也可能不是,但您可以暂时“禁止”这些用户代理,并等待他们向您投诉;-) 另一种方法是通过请求IP地址,这可以让您追踪罪犯并解释问题

最后(这不是一个最终的解决方案,但可以在一定程度上缓解这个问题),您可以缩短特定Jira实例上会话的生存时间。我也不知道Jira的设置,但通常这是可能的。如果此实例也为普通web用户提供服务,请小心,因为降低会话超时可能会对他们产生负面影响(即需要更频繁地重新登录)。

会话通常通过使用会话cookie“保留”。如果客户端没有在收到cookie时提取cookie,或者没有将其包含在后续请求中,那么您将拥有您描述的场景。如果没有包含cookie,则没有确定的方法将第二个请求链接到第一个请求

Jira会为这些请求创建一个会话,这听起来有点奇怪。如果它们真的是REST,那么它们将是无状态的,不需要任何会话状态。虽然我对Jira的安装一无所知,但我会先检查一下

无论如何,我可以想出一些方法来缩小“坏”客户的范围。一种是检查导致新会话的传入请求中的“用户代理”头。您可能会发现一种模式,即用户代理会导致更多的新会话,而用户代理不会。这可能是一个选项,也可能不是,但您可以暂时“禁止”这些用户代理,并等待他们向您投诉;-) 另一种方法是通过请求IP地址,这可以让您追踪罪犯并解释问题


最后(这不是一个最终的解决方案,但可以在一定程度上缓解这个问题),您可以缩短特定Jira实例上会话的生存时间。我也不知道Jira的设置,但通常这是可能的。如果此实例也为普通web用户提供服务,请注意降低会话超时可能会对他们产生负面影响(即需要更频繁地重新登录)。

假设这些工具正在调用您自己创建的REST插件点:在这些方法的上下文中,您可以向bean中注入一个,并调用
getLoggedInUser()
获取当前用户的
ApplicationUser
对象

如果非空,则可以获取用户名并将其与会话关联(
session.setAttribute(MY_username\u KEY,applicationUser.getName())

如果外部工具只是访问标准JIRA REST端点(即,它不是您的代码),那么您将需要使用
location=“before dispatch”
,创建一个带有插件模块的小型新JIRA插件,其中
覆盖坏客户端正在访问的REST URL。您也应该能够在那里注入
JiraAuthenticationContext
,然后只需执行与上面相同的步骤


如何选择枚举会话和检查最大值取决于您。一个选项,而不是直接将名称作为会话属性插入,是将自定义对象作为实现
httpsessionbindingstener
的会话属性插入,然后在
valueBound
valueUnbound
中实现适当的回调。我在JIRA中使用了后一种方法用于其他会话管理目的,我可以确认回调是按预期调用的。

假设这些工具正在调用您自己创建的REST插件点:在这些方法的上下文中,您可以向bean中注入一个,并调用
getLoggedInUser()
获取当前用户的
ApplicationUser
对象

如果非空,则可以获取用户名并将其与会话关联(
session.setAttribute(MY_username\u KEY,applicationUser.getName())

如果外部工具只是访问标准JIRAREST端点(即,它不是您的代码),那么您需要