0

我有一个带有 Java servlet 的标准 GAE 应用程序。我想在整个系统中实现用户角色功能。为此,我想从数据库中检索用户角色并将其存储在会话中,这样所有 servlet 都可以访问这些数据。我阅读了一些关于它的文章,基本的方法是使用过滤器为 HttpSession 填充必要的数据。但是,在这种情况下,我应该以相同的方式从每个 servlet 中的 HttpSession 检索数据,这会导致代码重复。这个问题的明显解决方案是从 HttpServlet 类派生并创建自己的 Servlet,并使用处理 HttpSession 的必要方法(例如受保护的角色 getUserRole())。这使得过滤器的使用毫无意义。在这种情况下有什么理由使用过滤器吗?

4

2 回答 2

0

您可以拥有一个直接从 HttpServlet 继承的主 servlet,该 servlet 知道如何通过protected Role getUserRole()从 HttpSession 获取用户角色。然后,您的应用程序中的所有其他 servlet 都应将该主 servlet 子类化,以使它们具有可用的通用功能。

Servlet 过滤器在调用任何其他 servlet 之前被调用,过滤器的主要目的是在将请求/响应交给 servlet 进行进一步处理之前装饰它们。您可以选择从过滤器中访问您的数据库并相应地填充 HttpSession,然后每个 servlet 稍后将知道如何从 HttpSession 中检索该信息。

我在这里推荐的另一个选项是使用处理请求的第一个 servlet 中的用户角色填充 HttpSession(您可以使用主 servlet 的另一种常用方法来执行此操作,例如 protected void populateUserRole(HttpSession httpSession))。

干杯;

于 2012-12-21T23:30:43.363 回答
0

您应该有一个顶级过滤器,它映射到/*. 如果会话中不存在此过滤器,它将从数据库中获取角色。现在您扩展HttpServletRequest并创建了一个包装器覆盖isUserInRole()方法,以便根据需要获取该角色。创建这个对象的一个request​​对象并chain.doFilter在Filter中使用。

所以所有的 Servlet 都可以调用request.isUserInRole()来检查角色

于 2012-12-21T23:22:14.587 回答