在Filter类中进行数据库调用是不好的做法吗?

时间:2015-12-01 14:43:17

标签: java session servlet-filters

我们有一个Web应用程序。我们希望阻止同一用户的多次登录。基本上,我们想要发生的是:

  1. John登录为" user1"在申请表中。
  2. 由于一些不明原因,John的机器有点挂起。
  3. 约翰不能等。 John转到machine2,在那里打开浏览器并以" user1"登录。
  4. 第一台机器中浏览器中的John会话现在应该无效。
  5. 要做到这一点,我们计划在数据库中保存所有登录用户的所有sessionIds。这是为了检查具有相同用户名的另一个用户是否已在另一台计算机中登录或在同一台计算机中使用了另一个浏览器。为了实现这一点,我们计划在Filter类中执行会话ID检查以检查会话。有了这个,每次调用Filter类时都会有数据库调用。

    这是一个好习惯吗?

    编辑:

    将始终遵循已登录的最新用户的sessionId。因此,在示例中,当John使用计算机2中的浏览器登录时,保存在数据库中的sessionId(来自machine1)将在machine2的浏览器中被会话的sessionId覆盖。现在,当再次使用machine1中的浏览器时,它会自动使会话无效,因为它检测到用户的sessionId现在不同

1 个答案:

答案 0 :(得分:0)

这取决于您所谓的数据库调用。过滤器使用数据库中的值是完全可以接受的。但直接在过滤器中进行数据库调用确实是一种不好的做法,因为它不尊重分层开发。

我的建议是过滤器只应调用服务层。

注释给出了Spring Security的示例,其中用户角色数据库用于过滤器机制中。但事实上,过滤器类对数据库一无所知,并要求其他类(相当于服务和持久层)来完成实际的工作。

TL / DR:在过滤器中使用数据库存储数据是可以的,应避免在过滤器中进行JDBC调用。