Spring MVC (Hibernate+Maven) - 多个控制器和会话(登录/注销)

Posted

技术标签:

【中文标题】Spring MVC (Hibernate+Maven) - 多个控制器和会话(登录/注销)【英文标题】:Spring MVC (Hibernate+Maven) - Multiple Controllers and Sessions (Login/Logouts) 【发布时间】:2017-06-21 20:30:27 【问题描述】:

我正在使用 Spring MVC、Hibernate 和 Maven 开展一个中等规模的项目。

我的应用程序有一个登录页面,该页面对用户进行身份验证,然后路由到具有菜单的主页。从菜单中,用户可以转到多个菜单选项。应用分为多个模块——员工、工资单、缺勤管理等。

在这个平台上相当新,几乎没有问题。

    控制器:我应该对整个应用程序使用单个控制器还是使用多个控制器?

    如果我应该使用多个 - 它应该是一个用于登录模块的控制器,一个用于每个模块(例如员工、工资单等)吗?我怎样才能让他们互相交谈并通过控制?

    @RequestMapping 标记的方法的返回值应该是多少?如果我只是将返回值作为'return "Employee"' 并且我的视图中确实有一个 Employee.jsp,但是与 Employee 相关的东西在 EmployeeController 中,我如何确保我的代码没有仍然停留在以前的控制器中(例如登录控制器)?

    我是否需要创建一个主控制器来管理所有这些控制器?

    为了在所有页面中保留用户凭据,我必须在登录模块中使用会话对象吗?或者 Spring MVC 会默认处理吗?

我发现很少有相关页面。它们很好,但它们解释了非常简单的场景,对我的实际问题没有用。

感谢您对上述问题的帮助。 谢谢!

【问题讨论】:

【参考方案1】:

回答这个问题的最简单方法是像对待您编写的任何其他代码一样对待控制器。在设计课程时,我们遵循以下原则:

单一责任主体 关注点分离

通常可以接受创建一个控制器,该控制器接受多个 URI 端点,这些端点操纵 CRUD 操作的特定模型,因为这些端点通常接受相同或几乎相同类型的输入。但是为不同的模型或整个应用程序创建一个控制器违反了上述两点;但是,您有权发表您的意见:)。

要了解控制器通信,您需要了解一般意义上的 HTTP 工作原理。 Web 应用程序只不过是一种设计请求-响应系统的奇特方式。你告诉你的浏览器去一个特定的 URL,它会将该请求发送到服务器。服务器解释您的请求,可能会操纵本地服务器端状态,查询数据存储(如果适用),最后回复响应。这种反应本质上可以是静态的或动态的。动态响应可以转发到视图技术以呈现您收到的最终内容。这些视图技术也可以是 JSP/JSF 之类的服务器端或 Angular 之类的客户端。

Spring MVC 控制器通过视图编排导航与每个控制器进行对话。当您在网页上放置按钮、表单或链接时,它表示从该页面转换到另一个页面的导航路径。在 Spring MVC 等基于动作的框架中,这通常意味着您通过将请求发送到另一个控制器来转换到新页面,该控制器解析请求,可能是一些动作,最后将状态传递给视图。

不需要 master 控制器,只需了解您正在处理的控制器类型即可。在 Web 2.0 革命和 AJAX 之前,我们只有一种类型的控制器,用于处理用户从一个视图到另一个视图的转换。今天,随着 AJAX 和动态内容成为主流,您通常会拥有另一种类型的控制器,其唯一目的是成为数据提供者。它不一定意味着从一个视图转换到另一个视图,因为它意味着基于某些输入呈现部分页面动态内容。

举个例子

@Controller
public class EmployeeController 
  @RequestMapping("/employee/view")
  public String viewEmployee(@RequestParam("id") Integer id, Model model) 
    // lookup the employee by the passed "?id=123" 123 value
    final Employee employee = employeeService.getEmployee( id );

    // set the employee in the model so I can render it in JSP
    model.addAttribute( "employee", employee );

    // return the name of what view to display
    return "view";
  

此处显示的此代码不会卡在“先前”控制器中,因为用户需要提交表单或单击链接或按钮以向服务器提交请求,例如 /employee/view?id=123 才能使用该控制器做它的工作。

最后,是的,HttpSession 对象对于跨多个请求跟踪状态是必需的。 HttpRequest 是一个短暂的对象,在其HttpSession 的整个生命周期中,单个用户执行了数十到数百个对象。

在 spring-world 中,您经常将 Spring Security 配置为处理身份验证。在这种情况下,该库将维护SESSIONID 和用户身份验证之间的关系,以便在每个HttpRequest 上,它知道用户是否已通过身份验证,如果没有,则将他们重定向到登录或允许他们的请求调用控制器如果有的话。

【讨论】:

感谢 Naros 为我指明了正确的方向。 :) 我已经开始进一步研究,如果我有任何其他疑问,会通知您。

以上是关于Spring MVC (Hibernate+Maven) - 多个控制器和会话(登录/注销)的主要内容,如果未能解决你的问题,请参考以下文章

spring mvc+spring + hibernate 整合

spring mvc+spring + hibernate 整合

spring4整合hibernate5.1

Hibernate - Spring Security - Spring MVC 版本

spring 4 mvc + Hibernate + Annotations 配置堆内存问题

Spring+Spring MVC+Hibernate框架搭建实例