从HttpSession存储/检索常用数据的最佳方法

时间:2012-12-21 23:14:57

标签: java google-app-engine java-ee servlets

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

你可以有一个直接从HttpServlet继承的主servlet,这个servlet知道如何通过受保护的角色getUserRole()从HttpSession获取用户角色。然后,应用程序中的所有其他servlet应该将该主servlet子类化,以使其具有可用的公共功能。

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

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

干杯;