【问题标题】:Spring Session User Info retrieval in Dao layerDao层的Spring Session用户信息检索
【发布时间】:2011-04-22 10:35:49
【问题描述】:

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

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

// 其中请求是 HttpServletRequest HttpSession 会话 = request.getSession(true); SystemUser user = (SystemUser) session.getAttribute("user");

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

不知道Spring有没有办法访问Dao层的session对象? 或任何其他检索用户特定数据的方式。

【问题讨论】:

    标签: java security spring session


    【解决方案1】:

    你可以使用RequestContextHolder:

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

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

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

    【讨论】:

    • 在业务逻辑层和/或数据访问层中使用表示层对象(如请求/会话)是一种非常糟糕的做法。这会将您的层绑定到表示对象,并会在更改表示层、扩展应用程序等时引起问题。
    • @Faisal:我同意。然而,这是被问到的问题,这就是答案。如果您认为这是对该问题的错误答案,请务必投反对票,但如果您反对问题本身,请在其他地方投反对票。
    • 虽然我对此表示支持 skaffman,但我也觉得作为一名经验丰富的开发人员,Skaffman 应该在他的回答中指出这种做法是一种不好的做法。
    • @anirvan:已相应编辑。
    • 我了解到,由于紧密耦合,我们不认为上述解决方案是一种有效的解决方案。谁能回答在Spring的DAO层访问会话对象的正确方法?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 2018-08-03
      • 2023-03-26
      • 2017-10-11
      • 2019-09-19
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多