【问题标题】:Best way to store/retrieve frequently used data from the HttpSession从 HttpSession 存储/检索常用数据的最佳方法
【发布时间】:2012-12-09 12:30:33
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    干杯;

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 听起来不错,谢谢!但是,这种方法涉及将 HtppServletRequest 对象转换为每个 servlet 中的自定义包装器。而且它似乎对 HttpServlet 的子类化和在那里实现会话处理功能没有任何好处?
      • no isUserInRole 方法应该被覆盖,这是 HttpServletRequest 中的一个方法。因此不需要转换为 customServlet。只需调用 request.isUserInRole()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多