在我的服务层中传递http servlet响应是不好的做法?

时间:2012-02-10 02:58:31

标签: java spring servlets spring-mvc

在我的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应用程序。

我这样做了吗?

2 个答案:

答案 0 :(得分:6)

是(对“不良做法”),否(对“做这个权利”)。

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

这样即使不存在cookie(例如桌面或CLI应用程序),也可以使用该服务。它还允许在不考虑Web层的情况下测试服务,这是有道理的 - 服务不关心如何身份验证发生,或之后发生的事情 - 仅使用用户名和密码的工作原理。

答案 1 :(得分:1)

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

如果您可以隔离处理来自实现业务规则的代码的混乱不受信任输入的代码,并根据域对象实现更改,从将响应格式化为外部世界的代码,您的代码将更易于维护和安全

如果您可以将服务分成:

  1. 将HTTP请求转换为域对象的简单层,
  2. 对产生结果的域对象进行(可能是复杂的)操作,
  3. 将结果转换为HTTP响应的简单图层
  4. 然后您可以将单元测试集中在2上,而无需担心创建和填充存根请求和响应对象。