Dao层中的Spring Session用户信息检索

时间:2010-10-07 15:19:38

标签: java security spring session

我在java中有一个web应用程序,spring框架,tomcat上的hibernate,除了登录和注销功能(没有弹簧安全性)之外几乎没有任何安全性

我可以通过以下方式访问控制器中的用户信息:

// where request is HttpServletRequest
 HttpSession session = request.getSession(true);
 SystemUser user = (SystemUser) session.getAttribute("user");

并做逻辑。但是,我需要在Dao层获取此信息。我实际从数据库中获取数据以检索用户特定数据的位置。 一种方法是将“用户”对象传递给服务层,然后将服务层传递给dao层。但这是一项相当大的工作。

我想知道Spring中是否有一种方法可以访问Dao层中的会话对象? 或以任何其他方式检索用户特定数据。

2 个答案:

答案 0 :(得分:10)

您可以使用RequestContextHolder

ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpSession session = requestAttributes.getRequest().getSession();

因为它使用静态方法,所以可以从任何地方调用它,只要它来自处理请求的同一个线程。

编辑:正如费萨尔正确指出的那样,这通常不是一个好主意,因为它会导致不合需要的耦合和难以测试的代码。但是,在某些情况下,它是不可避免的,例如当代码的接口被修复时(例如遗留服务或JSP标记库等)。

答案 1 :(得分:8)

这可能仅仅是我个人的观点,但您最好将此类信息作为方法参数传递,而不是在DAO中访问Web上下文类。

如果您想在Web应用程序之外使用DAO类,该怎么办?

访问某种请求上下文持有者的DAO提出了DAO方法需要运行隐藏秘密的数据的问题 - 而不是为其所需的数据声明方法参数,它正在秘密访问某些类的静态方法

这导致难以测试和难以理解的代码。