Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在我的服务层中传递HTTPServlet响应是一种糟糕的做法吗?_Java_Spring_Servlets_Spring Mvc - Fatal编程技术网

Java 在我的服务层中传递HTTPServlet响应是一种糟糕的做法吗?

Java 在我的服务层中传递HTTPServlet响应是一种糟糕的做法吗?,java,spring,servlets,spring-mvc,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 //

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


我这样做对吗?

是的。尽可能快地将网络消息转换为域对象,在确定整个消息的格式正确且经过授权之前,不要采取任何行动

如果您能够将处理混乱的不可信输入的代码与实现业务规则的代码隔离开来,并根据域对象执行更改,与格式化对外部世界的响应的代码隔离开来,那么您的代码将更易于维护和安全

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

  • 将HTTP请求转换为域对象的简单层
  • 对域对象执行的(可能很复杂)操作,可产生结果
  • 将结果转换为HTTP响应的简单层
  • 然后,您可以将单元测试的重点放在2上,而不用担心创建和填充存根请求和响应对象。

    是(对“坏习惯”),否(对“正确操作”)

    服务层应该与任何与web有关的内容完全解耦。web层单独负责管理web层工件,包括cookie


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

    因此,一旦用户通过身份验证,会话就必须写入数据库,服务层不应该这样做吗?还是和饼干一样?那么这应该在控制器中的什么位置?@Blankman不确定为什么必须将会话或会话ID写入数据库,但您的应用程序可能需要这样做。我想大多数人不会,但这要看情况而定。在任何情况下,服务都应该从控制器获得会话ID,并且仍然与web层保持解耦。+1假定的“多层”体系结构直接通过每一层与web耦合,这是一个巨大的麻烦!