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

Java 从HttpSession存储/检索常用数据的最佳方法,java,google-app-engine,jakarta-ee,servlets,Java,Google App Engine,Jakarta Ee,Servlets,我有一个带有Java servlet的标准GAE应用程序。我想在整个系统中实现用户角色功能。为此,我希望从数据库中检索用户角色并将其存储在会话中,这样所有servlet都可以访问该数据。我读了一些关于它的文章,基本方法是使用过滤器用必要的数据填充HttpSession。但是,在本例中,我应该以相同的方式从每个servlet中的HttpSession检索数据,这会导致代码重复。这个问题的明显解决方案就是从HttpServlet类派生并创建自己的Servlet,其中包含使用HttpSession所需

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

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


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

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

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

我在这里建议的另一个选项是使用处理请求的第一个servlet中的用户角色填充HttpSession(您可以使用主servlet的另一个常用方法来完成此操作,例如受保护的void populateUserRole(HttpSession HttpSession))


干杯

听起来不错,谢谢!但是,这种方法涉及将HtpsServletRequest对象强制转换到每个servlet中的自定义包装器。与HttpServlet的子类化和在那里实现会话处理功能相比,它似乎没有任何好处?HttpServletRequest中的方法不应被重写。因此不需要对customServlet进行转换。只需调用request.isUserInRole()