【问题标题】:Is it a bad practise to pass the http servlet response in my service layer?在我的服务层传递 http servlet 响应是一种不好的做法吗?
【发布时间】:2012-02-10 02:58:30
【问题描述】:

在我的 authenticationService 的登录方法中,我需要创建一个 cookie 并在 cookie 中设置会话 ID。

在控制器操作中将请求对象传递给我的服务层是不好的做法吗?

public void login(String email, String password) {

   User user = someService.validate(email, password);

   if(user != null) {
      // create session
      // set cookie ????
   }

}

我的控制器操作将调用上面的登录方法,我很困惑我应该在哪里为我的 cookie 创建和设置会话 ID。

在服务层中使用它对我来说很有意义,但是我的登录方法随后会紧密绑定到 Web 应用程序。

我这样做对吗?

【问题讨论】:

    标签: java spring servlets spring-mvc


    【解决方案1】:

    是(对“不良做法”),不是(对“正确地做这件事”)。

    服务层应该与任何与网络有关的事物完全分离。 Web 层应单独负责管理 Web 层工件,包括 cookie。

    这样,即使 cookie 不存在,也可以使用该服务,例如桌面或 CLI 应用程序。它还允许在根本不考虑 Web 层的情况下测试服务,这是有道理的——服务不关心身份验证如何发生,或者之后会发生什么——只关心使用用户名和密码有效。

    【讨论】:

    • 所以一旦用户通过身份验证,会话必须写入数据库,服务层不应该这样做吗?还是和cookie一样?那么这应该在哪里,在控制器中?
    • @Blankman 不确定为什么会话或会话 ID 必须 写入数据库,但您的应用可能需要这样做。我不认为大多数人都这样做,但这一切都取决于。在任何情况下,服务都应该从控制器获取会话 ID,并且仍然与 Web 层保持分离。
    • +1 所谓的“多层”架构直接通过每一层与网络耦合是一个巨大的麻烦!
    【解决方案2】:

    是的。尝试尽快将网络消息转换为域对象,并且在您确定整个消息格式正确并获得授权之前不要采取任何行动。

    如果您可以将处理混乱的不受信任输入的代码与实现业务规则并基于域对象进行更改的代码与格式化对外部世界的响应的代码隔离开来,您的代码将更加可维护和安全.

    如果你可以将你的服务分成:

    1. 将 HTTP 请求转换为域对象的简单层,
    2. 对域对象进行的(可能很复杂)操作会产生结果,
    3. 将结果转换为 HTTP 响应的简单层,

    然后您可以将单元测试重点放在 2 上,而不必担心创建和填充存根请求和响应对象。

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多