Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】
全部章节 >>>>
本章目录
8.1 Session机制
8.1.1 Session 简介
- Session 是服务器端记录客户端信息的机制,比 Cookie 更为简单安全,但是增加了服务器的内存压力,是使用最为普遍的一种会话跟踪技术
- Cookie虽然也可以存储用户信息,和Session最大区别在于:Cookie 保存在客户端浏览器中(不安全),而 Session 保存在服务器中
Session 识别:
- 当客户端访问某个编写了创建 HttpSession 实例代码的 Servlet 时,才会创建一个 HttpSession 实例,并为其分配一个独一无二的会话 ID,将ID以 Cookie 的方式传递给客户端
- 客户端需要记住此会话ID,并在后续每次请求时将此会话 ID 回传给 Web 服务器,Web 服务器程序会根据回传的会话 ID,找到对应的HttpSession 实例
- HttpSession 实例中存放对象数据,也可以随时从 HttpSession 实例中取出对象数据或移除对象数据
8.1.2 创建 HttpSession 实例
HttpServletRequest 接口中提供了两个方法来创建 HttpSession 实例
方法名 |
作用 |
public HttpSession getSession() |
服务器判断当前请求是否已存在会话,如果存在则返回匹配的会话实例;不存在则创建一个新会话实例,并且分配唯一SessinID |
pulbic HttpSession getSession(boolean flag) |
flag 用于指定是否有必要创建一个新的会话,为false时 ,如果客户端先前没有建立会话,则此方法返回 null |
示例:
HttpSession session = request.getSession();
从request对象中获取session对象
8.1.3 HttpSesison 的常用方法
HttpSession 接口中常用方法如下
方法名 |
作用 |
void setAttribute(String name,Object value) |
用于以键值对形式向session中存入数据 |
Object getAttribute(String name) |
用于从session中获取指定键的值 |
void removeAttribute(String name) |
根据键从session中移除某个数据 |
String getId() |
用于获取 session对象的ID |
boolean isNew() |
判断当前会话是否是新建的会话 |
void invalidate() |
使当前 Session 失效,如退出登录时调用 |
public void setMaxInactiveInterval(int seconds) |
设置 Session 的有效时间,单位为秒 |
int getMaxInactiveInterval() |
获取Session 的有效时间,单位为秒 |
示例:使用Session常用方法存取数据
Date createTime = new Date(session.getCreationTime());
Date lastAccessTime = new Date(session.getLastAccessedTime());
if (session.isNew()) {
title = "Welcome to my website";//判断session是否是新的会话,如果是则存入数据
session.setAttribute(userIDKey, userID);
session.setAttribute(visitCountKey, visitCount);
}
visitCount = (Integer) session.getAttribute(visitCountKey);//取出session中的数据
userID = (String) session.getAttribute(userIDKey);
session.setAttribute(visitCountKey, visitCount);
8.1.4 Session 的有效期
session是服务端开辟存储客户端会话数据的内存空间,随着访问人数越多, session也会越多,而服务端并不知道客户端何时关闭浏览器结束会话,所以session引入了默认超时时间30分钟
- 可以在代码中通过设置maxInactiveInterval属性调整超时时间(秒)
- 可以在tomcat安装目录下web.xml中修改配置文件设置全局超时时间(分钟)
8.1.5 Session 与 Cookie 比较
- Session和Cookie都可以存储客户端数据,其区别如下:
- 存取方式上有不同:session可以存储任何数据类型,cookie只能存储字符串
- 存储有效期时间有不同:session服务端决定时间,cookie则是浏览器
- 对服务器造成的负担不同:session存在服务端,对服务器影响大;cookie则是客户端上
- 浏览器支持有不同:cookie需要客户端浏览器支持 安全性上有不同:cookie存储在客户端,有安全性隐患
8.1.6 实践练习
8.2 URL 重写技术
8.2.1 URL 重写技术概述
Cookie 被证明存在安全隐患,因此一些谨慎的用户都会在浏览器中设置禁用 Cookie,如下IE浏览器设置
浏览器禁用Cookie后,session将无法正常使用
如何解决禁用Cookie后的问题?
可以使用 URL 重写机制跟踪用户会话:
- URL 重写技术会在 URL 请求中嵌入标识客户的 SessionID,使用 Servlet 容器解释 URL 并取出 SessionID,根据 SessionID 将请求与特定的 Session 关联
8.2.2 URL 重写技术原理
HttpServletResponse 接口定义两个用于自动完成 URL 重写的方法:
- public String encodeURL(String url),用于自动重写超链接和 form 表单的 action 属性的 URL
- public String encodeRedirectURL(String url),用于自动重写要传递给 HttpServletResponse 接口中的sendRedirect() 方法的 URL
两个方法首先会判断客户请求消息中是否包含 Cookie 字段,如果没有则表示客户端不支持 Cookie,它将把会话ID 作为 JSESSIONID 参数值连接到 URL 末尾,如果有则不会附加 JSESSIONID 参数值。
示例:禁用Cookie后,使用URL重写保持sessionID以识别同一会话
PrintWriter pw=response.getWriter();
pw.println("<title> 未使用 URL 重写 </title>");
pw.println("<a href='"+response.encodeURL("CreateSessionServlet")+"'> 点击后
跳转至 CreateSessionServlet</a>");
pw.close();
使用URL重写将sessionID跟在URL后面
8.2.3 实践练习
8.3 综合应用——购物车系统(一)
8.3.1 购物车系统概述
购物车系统(E-Shopping Cart System)是电子商务系统中非常关键的一个功能模块,如网上购物系统、网络购物系统和网上开店系统等,实质上都是一样,就是程序结合数据库开发的网站系统
购物车系统中,用户浏览商品后将选中的商品放入购物车中,可以随意切换至其他界面,不同用户不同购物车中商品可以随时查看和移除,并且能在最终结账产生订单
8.3.1 表购物车系统的功能模块
一般的购物车系统集成了产品发布与查询、会员注册登录、购物车、在线订单、在线支付和在线交流等完善的网上销售功能,最主要的是管理员只需要登录网站后台管理就可以在线发布商品、处理订单,完全不需要任何网站建设的知识
购物车系统中首先必须有商品的列表展示功能,用户选择商品后,可以放入购物车,购物车模块中需要提供如下功能
- 加入购物车
- 查看购物车
- 购物车中商品移除
- 清空购物车
- 提交购物车结算
8.3.2 实践练习
8.4 综合应用——购物车系统(二)
8.4.1 购物车的发展趋势
商务网站的购物车系统功能:
- 包含用户登录界面
- 用户进行登录后,可以完成查看产品类型,查看购物车内容、订购产品、显示订购单和删除指定订单等相应功能
- 若成功订购,还可以按照网页指示用银行划拨或信用卡方式进行支付
8.4.1 购物车的实现
购物车实际就是一个存放用户选中商品的容器,需要考虑以下几个问题:
- 区分不同用户,不同用户选择的商品归属用户自己
- 跨越多个不同界面有效,用户经常来回商品、搜索、购物车不同的界面
将购物车中的商品信息存放在Session中是非常适合的,session可以区分不同的客户端,还能跨越多个界面存储数据
购物车中需要存放多个商品信息,以什么形式存储这些商品更为方便放入、移除、累加?
用户可以选择多个不同的商品放入购物车,可以使用List或者Map均可以实现购物车中已选商品信息的存储
示例:添加数据到购物车
public void addCar(HttpServletRequest request, HttpServletResponse response) {
// 获取 Session 对象中已存在的购物车信息
HttpSession session = request.getSession();
List<Shopping> carShoppingList = (List<Shopping>) session.getAttribute("scl");
if (carShoppingList == null) {
carShoppingList = new ArrayList<Shopping>();
}
// 获取提交选中要放入购物车的商品信息数组
String[] goods = request.getParameterValues("goods");
for (String good : goods) {
Shopping shopping = new Shopping();
//商品对象信息赋值代码省略
// 将商品添加至 carShoppingList 集合中
carShoppingList.add(shopping);
}
// 将 carShoppingList 保存至 Session 范围内
session.setAttribute("scl", carShoppingList);}
示例:查看购物车
HttpSession session = request.getSession();
// 获取购物车中的商品集合
List<Shopping> shoppingCar = (List<Shopping>) session.getAttribute("scl");
System.out.println(shoppingCar);
if (shoppingCar == null) {
// 购物车中没有商品
request.setAttribute("msg", " 对不起,购物车中没有商品 ");
request.getRequestDispatcher("ShoppingServlet").forward(request, response);
} else {
HashSet<Shopping> shoppingSet = new HashSet<Shopping>(shoppingCar);
// 创建 List 对象用户保存同一商品被放入购物车中的次数
List<Integer> timesList = new ArrayList<Integer>();
for (Shopping shopping : shoppingSet) {
int times = Collections.frequency(shoppingCar, shopping);
timesList.add(times);
}
}
//跳转到显示数据界面
8.4.2 实践练习
总结
- Session是服务端用于保存客户端数据的内容空间,为了区分不同的客户端,每个Session都有唯一的SessionID标识,该ID是以Cookie的形式发给客户端
- 通过HttpServletRequest对象的getSession()方法可以获取Session对象
- 通过调用Session对象的setAttribute和getAttribute可以存入和取出session中的数据
- Cookie是存储在客户端,而Session是存储在服务端
- 客户端禁用Cookie后,可以使用URL重写技术保持sessionID的有效性
- 购物车是电商应用中必不可少的一个功能模块,一般都是以集合的形式存储在Session中
Java Web程序设计笔记 • 【第8章 会话跟踪技术进阶】的更多相关文章
- Java Web程序设计笔记 • 【目录】
章节 内容 实践练习 Java Web程序设计作业目录(作业笔记) 第1章 Java Web程序设计笔记 • [第1章 Web应用程序] 第2章 Java Web程序设计笔记 • [第2章 JSP基础 ...
- Java Web程序设计笔记 • 【第7章 会话跟踪技术】
全部章节 >>>> 本章目录 7.1 会话跟踪技术概述 7.1.1 为什么需要会话跟踪 7.1.2 会话的状态和跟踪 7.1.3 会话跟踪技术 7.1.4 会话跟踪工作流程 ...
- Java Web程序设计笔记 • 【第5章 Servlet技术】
全部章节 >>>> 本章目录 5.1 Servlet 技术介绍 5.1.1 为什么需要Servlet 5.1.1 Servlet 简介 5.1.2 Java Web 处理流 ...
- Java Web程序设计笔记 • 【第6章 Servlet技术进阶】
全部章节 >>>> 本章目录 6.1 应用 Servlet API(一) 6.1.1 Servlet 类的层次结构 6.1.2 使用 Servlet API 的原则 6.1 ...
- Java Web程序设计笔记 • 【第1章 Web应用程序】
全部章节 >>>> 本章目录 1.1 Web 应用程序 1.1.1 Web 应用程序概述 1.1.2 Web 应用程序的工作原理 1.1.3 实践练习 1.2 HTTP协议 ...
- Java Web程序设计笔记 • 【第4章 JavaBean和JSP标准动作】
全部章节 >>>> 本章目录 4.1 JavaBean 4.1.1 JavaBean 概述 4.1.2 JavaBean的重要性 4.1.3 JavaBean的特点 4.1 ...
- Java Web程序设计笔记 • 【第3章 JSP内置对象】
全部章节 >>>> 本章目录 3.1 JSP 内置对象简介 3.1.1 JSP 内置对象概述 3.1.2 JSP 表单处理 3.1.2 request对象 3.1.2 开发 ...
- Java Web程序设计笔记 • 【第9章 EL表达式】
全部章节 >>>> 本章目录 9.1 EL 表达式基础 9.1.1 EL 表达式简介 9.1.2 EL 表达式的定义 9.1.3 使用 EL 访问变量 9.1.4 使用 E ...
- Java Web程序设计笔记 • 【第2章 JSP基础】
全部章节 >>>> 本章目录 2.1 JSP 简介 2.1.1 JSP 概述 2.1.2 开发第一个 JSP 页面 2.1.3 JSP 处理流程 2.1.4 实践练习 2. ...
随机推荐
- Ecshop 后台导出订单Excel时, 内存溢出的解决方法
今天继续跟大家分享一下,在我配置Ecshop时的问题. 今天的问题是在后台想要导出订单列表Excel时出现的内存溢出.错误提示如下 问题: Fatal error: Allowed memory s ...
- 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(六)-FatFs使用的思路介绍
[STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...
- Oracle中的索引
1.Oracle 索引简介 在Oracle数据库中,存储的每一行数据都有一个rowID来标识.当Oracle中存储着大量的数据时,意味着有大量的rowID,此时想要快速定位指定的rowID, ...
- 事务(@Transactional注解)的用法和实例
参数 @Transactional可以配制那些参数及以其所代表的意义: 参数 意义 isolation 事务隔离级别 propagation 事务传播机制 readOnly 事务读写性 noRollb ...
- Siebel调用WebService
Siebel可以调用外部系统的接口,通过WebService的接入方式实现,所在的项目都是通过ESB,其他系统的接口都要经过ESB,由ESB提供WSDL文档,通过Siebel调用. 一.修改Tools ...
- Druid数据库监控
一.简介 Druid是阿里开源的一个JDBC应用组件, 其包括三部分: DruidDriver: 代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource ...
- Thymeleaf标准表达式
Thymeleaf的官网为: http://www.thymeleaf.org/ 一.变量表达式${-} 使用${-}括起来的表达式,称为变量表达式.该表达式的内容会显示在HTML标签体文本处. 该表 ...
- Java 使用slf4j记录日志
引入依赖 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12< ...
- OceanBase 2.x体验:推荐用DBeaver工具连接数据库
Original MQ4096 [OceanBase技术闲谈](javascript:void(0) 2020-01-15 OceanBase 2.x体验:推荐用DBeaver工具连接数据库 Ocea ...
- 『学了就忘』Linux启动引导与修复 — 72、Linux系统的修复模式(单用户模式)
目录 1.单用户模式常见的错误修复 2.通过单用户模式修改系统密码 (1)进入grub启动引导程序中 (2)编辑相应的系统启动内容 (3)编辑grub配置文件内容 (4)启动系统 (5)修改root用 ...