Appearance
SpringMVC教程 - 8 域对象
下面先来介绍一下 Web 项目中的一些基本概念,并介绍在 SpringMVC 中的使用。
8.1 域对象
什么是域对象?
在 Web 开发中,域对象(Scope Object)是服务器端用于在不同组件之间传递与共享数据的容器。它解决的问题是:当我们在一个 Servlet、Controller 或页面中产生了数据,如何在后续的页面或请求中继续使用这些数据。
8.1.1 域对象简介
Java Web 中最常用的域对象主要是以下三种:
1 Request请求
对应的类是 HttpServletRequest ,在前端或页面中,每次发送一次请求就是新的 Request 对象。
一般前端页面向 Controller 传递数据,Controller 处理后再将数据转发到页面模板。这两步操作都处于同一个请求过程(即同一个 Request 对象)。因此,在页面中可以直接访问由 Controller 设置在 Request 域中的属性。
2 Session会话
对应的类是 HttpSession ,Session 的整个执行流程如下:
- 当用户访问服务器时,当服务器端的代码**第一次调用 **
request.getSession()时,Web容器会创建新的Session对象,并生成Session ID,通过 Set-Cookie 发给客户端浏览器; - 浏览器在收到服务器响应头里的
Set-Cookie: JSESSIONID=xxx时,会自动保存到本地 Cookie 存储; - 之后访问同域名时,浏览器会自动把这个 Cookie 附加在请求头里;
- 服务器的Web容器会自动解析请求头的 Cookie,找到 JSESSIONID,并去 Session 管理器里查找对应的 Session 对象,判断是否是同一个 Session。
这个操作流程是不需要我们介入的,是浏览器和 Web 容器(例如Tomcat)自己完成的,我们只需要关心如何向 Session 对象中存入信息,并验证其中的信息就可以了。
Session 是有过期时间的,默认 30 分钟(可在 web.xml 或容器中修改)。客户端每次发送携带 JSESSIONID 的请求时,服务器都会刷新 Session 的有效期。因此,从 Session 创建到浏览器关闭之间,只要 Session 未过期,就属于同一个会话。如果 Session 已过期,再次调用 request.getSession() 时会重新创建新的 Session。
在传统项目中(非前后端分离),用户请求服务器登录,在服务器端我们可以将用户登录信息保存在 Session 会话中,然后在后面每次请求,我们可以验证会话中有没有登录信息,如果有登录信息,那么就可以成功访问后续资源;如果没有,就跳转到登录页面。
但是这也会存在问题,就是一般服务器压力过大,我们会使用负载均衡,将请求分发到多台服务器上,但是 Session 是没有办法跨服务器的,所以一次请求到达服务器A,将登录信息保存在服务器A 的 Session 对象中,后面请求被分发到服务器B,那么服务器B上没有登录信息,就会认为没有登录。针对这种情况,一般使用 Redis 缓存数据库来保存用户登录信息。同样在前后端分离的项目,一般也是将用户登录信息保存到 Redis 缓存数据库中。当然也可以不使用 Redis,使用 JWT 的方式,通过验证 JWT 的 token 合法性来确认请求是否有效,在本课程的最后,我们会演示一下。
3 Application应用
对应的类是 ServletContext ,Application 是整个应用共享的,从 Web 启动到关闭都有效,所有用户都能访问同一份数据。
一般用于全局配置或全局统计数据,例如通过多少人访问网站,可以使用 Application 对象。
内容未完......
