我在java中有一个web应用程序,spring框架,tomcat上的hibernate,除了登录和注销功能(没有弹簧安全性)之外几乎没有任何安全性
我可以通过以下方式访问控制器中的用户信息:
// where request is HttpServletRequest HttpSession session = request.getSession(true); SystemUser user = (SystemUser) session.getAttribute("user");
并做逻辑。但是,我需要在Dao层获取此信息。我实际从数据库中获取数据以检索用户特定数据的位置。 一种方法是将“用户”对象传递给服务层,然后将服务层传递给dao层。但这是一项相当大的工作。
我想知道Spring中是否有一种方法可以访问Dao层中的会话对象? 或以任何其他方式检索用户特定数据。
答案 0 :(得分:10)
您可以使用RequestContextHolder
:
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpSession session = requestAttributes.getRequest().getSession();
因为它使用静态方法,所以可以从任何地方调用它,只要它来自处理请求的同一个线程。
编辑:正如费萨尔正确指出的那样,这通常不是一个好主意,因为它会导致不合需要的耦合和难以测试的代码。但是,在某些情况下,它是不可避免的,例如当代码的接口被修复时(例如遗留服务或JSP标记库等)。
答案 1 :(得分:8)
这可能仅仅是我个人的观点,但您最好将此类信息作为方法参数传递,而不是在DAO中访问Web上下文类。
如果您想在Web应用程序之外使用DAO类,该怎么办?
访问某种请求上下文持有者的DAO提出了DAO方法需要运行隐藏秘密的数据的问题 - 而不是为其所需的数据声明方法参数,它正在秘密访问某些类的静态方法
这导致难以测试和难以理解的代码。