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

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

我这样做了吗?

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

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

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

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

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

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

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

然后,您可以将unit testing重点放在2上,而无需担心创建和填充存根请求和响应对象。