Java Web程序设计笔记 • 【第7章 会话跟踪技术】
全部章节 >>>>
本章目录
7.1 会话跟踪技术概述
7.1.1 为什么需要会话跟踪
HTTP协议是“无状态”的,服务器端接收客户端的请求,生成HTTP响应回发,服务器端关闭连接
当发生一次请求和响应结束后服务器并不能记录信息,在这种协议下,不能完成 购物车这样的功能。因为,第二次请求服务器时,服务器并不知道客户端什么时候请求过,或者,上次购买过什么书籍
7.1.2 会话的状态和跟踪
会话的概念:
Web应用中的会话是指一个客户端浏览器与Web服务器之间连续发生的一系列请求和响应的过程。例如:生活中的打电话过程,在超市购物过程,都具有一系列连续过程
Web 应用的会话状态是指 Web 服务器与浏览器在会话过程中产生的状态信息。
- 在购物过程中,Web 服务器要记住客户的账号及其订购的产品,以便正确结算
- Web 服务器能够将同一会话中的一系列请求和响应过程关联起来,使它们之间可以相互依赖和传递信息
必须跟踪同一个客户所发出的一系列请求,会话跟踪技术使服务器应用程序可以保持客户状态等相关信息
7.1.3 会话跟踪技术
会话跟踪技术可以通过以下 4 种方式实现:
- Session 技术
- Cookie 技术
- 表单隐藏域技术
- URL 重写技术
7.1.4 会话跟踪工作流程
Web 服务器在一段时间会接收多个客户端浏览器的访问请求,Web 服务器为了区分哪些请求消息属于同一会话,需要浏览器对其发出的请求进行标识
属于同一个会话中的请求消息均附带同样的标识 ID,这个标识 ID 被称为会话 ID(SessionID)
上述的过程可以简单理解为去银行办理业务时的银行卡号,卡号类似sessionID
会话跟踪的流程如下:
- 客户端第一次访问 Web 服务器时,服务器为该客户端创建一个会话,并产生唯一的 SessionID
- 服务器响应客户端,将 SessionID 回传给客户端
- 客户端再次向 Web 服务器发出请求时,附带 SessionID,服务器根据 SessionID 来唯一标识客户端,不同客户端的SessionID是不同的
7.1.5 实践练习
7.2 Cookie技术
7.2.1 Cookie概述
Cookie 是Web 服务器在 HTTP 响应信息中附带传送给客户端浏览器的一段数据。一旦浏览器保存了这段数据,那么在以后每次访问该 Web 服务器时,都会在 HTTP 请求中将这段数据带给 Web 服务器
Cookie 是最先由 Web 服务器发出的,是否发送Cookie 和发送 Cookie 的具体内容,完全由服务器端程序来决定,但是Cookie数据是存储在客户端
不同版本浏览器Cookie数据的存储位置也大不相同
7.2.2 操作Cookie
Servlet API 中提供了一个 javax.servlet.http.Cookie 类来封装 Cookie 信息,常用操作方法如下
方法名 | 作用 |
Cookie(String name,String value) | 用于构造一个Cookie信息,键值对形式存储 |
public String getName() | 用于获取 Cookie 的名称 |
public void setValue(String value) | 用于设置 Cookie 的值为 Value |
public String getValue() | 用于获取 Cookie 的值 |
public void setMaxAge() | 设置 Cookie 在客户端浏览器上保存的有限时间(秒) |
public int getMaxAge() | 获取 Cookie 在客户端浏览器上保存的有限时间(秒) |
Cookie的存储:
服务端构建Cookie实例对象后,需要通过HttpServletResponse 接口中提供的 addCookie() 方法,将该Cookie发送给客户端浏览器接收
Cookie的获取:
Cookie是客户浏览器发送给服务器的,所以需要从HttpServletRequest中调用getCookies(),得到所有Cookie,即数组,遍历该 Cookie 数组,即可获取想要的 Cookie 信息
不同版本浏览器均可以设置是否启用Cookie,存储Cookie的位置也不同
示例:使用Cookie存储信息和读取Cookie中的信息
// 获取 Cookie 数组
Cookie[] cookies = request.getCookies();
if (cookies == null) {
pw.println(" 第一次访问 CookieServlet,此时还没有 Cookie 实例 ");
} else {
for (int i = 0; i < cookies.length; i++) {
pw.println("Cookie 名称 :" + cookies[i].getName() + ",
Cookie 值 :" +cookies[i].getValue());}
}
通过request对象获取所有Cookie得到数组,循环数组
7.2.3 Cookie有效期
Cookie 的 maxAge 决定 Cookie 的有效期,单位为秒,通过 getMaxAge() 方法与 setMaxAge(int maxAge) 方法来读写 maxAge 属性
- 正数,则表示该 Cookie 会在 maxAge 秒后自动失效,浏览器会进行存储,保证有效期
- 负数,则表示该 Cookie 仅在本浏览器窗口或打开的子窗口内有效,不会写到客户端存储
- 0,则表示删除该 Cookie
Cookie cookie=new Cookie(“username”,”cookies”);
cookie.setMaxAge(0); //表示删除该Cookie
response.addCookie(cookie); //如果同名会覆盖以前的Cookie
7.2.4 实践练习
7.3 表单隐藏域
7.3.1 表单隐藏域概述
隐藏域是用于收集或发送信息表单的不可见元素,对于网页的访问者而言,隐藏域是不可见的
隐藏域必须配合表单使用,和文本框类似,只不过看不见。当提交表单时,隐藏域会将信息用事先设置时定义的名称和值发送给服务器
<form action=“url 路径” method=“请求方法”>
<input type=“hidden” name=“隐藏域别名” value=“隐藏域的值”>
</from>
7.3.1 表单隐藏域的使用
隐藏域不可见,所以隐藏的信息一般都是提前预定的参数和数据值,比如修改信息时隐藏的id
<form action=“url 路径” method=“post”>
<input type=“hidden” name=“userId” value=“4”>
<p> 用户名:<input type=“text” name=“userName” value=“” /></p>
<p> 密码:<input type=“text” name=“userPwd” value=“” /></p>
<p> 地址:<input type=“text” name=“userAddr” value=“” /></p>
<p><input type=“submit” value=“修改” /></p>
</from>
id用户看不见,但是可以提交至服务器作为修改的条件
7.3.2 实践练习
7.4 综合应用——网页记住密码功能
7.4.1 网页记住密码功能概述
网页记住密码功能是许多网站都具备的功能,即用户勾选记住密码选项提交信息后,第二次打开该界面,密码默认显示在密码文本框中
实现思路是通过取 / 存 / 删 Cookie 实现的
- 进入登录页,先去读取 Cookie
- 如果浏览器的 Cookie 中有账号信息,说明存储过,就取出填充到登录框中
- 用户登录成功之后,判断当前用户是否勾选了记住密码,如果勾选了,则把账号信息存到 Cookie 当中
示例:使用Cookie实现网页记住密码功能
登录处理请求的Servlet核心代码思路:
//判断记住密码复选框是否勾选,如果勾选则执行下面代码
// 创建 Cookie 实例
Cookie cookie = new Cookie(“userPwd”, null);
cookie.setMaxAge(0);
response.setContentType("text/html;charset=utf-8");
PrintWriter pw = response.getWriter();
// 向响应中添加 cookie
response.addCookie(cookie);
7.4.2 实践练习
总结
- Http协议是一种无状态的协议,它不记录任何客户端相关信息
- 会话跟踪技术使服务器应用程序可以保持客户状态等相关信息,从而能够区分跟踪不同用户
- 常用的会话跟踪技术包括:Session技术、Cookie技术、表单隐藏域技术、URL重写技术
- Cookie是服务器将数据发送给客户端,客户端将数据存放在本地的一种技术
- 隐藏域是用于收集或发送信息表单的不可见元素,当提交表单时,隐藏域会将信息用事先设置时定义的名称和值发送给服务器
本文来自博客园,作者:明金同学,转载请注明原文链接:https://www.cnblogs.com/vmuu/p/15663339.html
公众号:【明金同学】