Cookie&Session
今日任务
- 显示用户的上次访问时间
- 显示商品浏览记录
- 购买商品将商品添加到购物车
- 系统登录的验证码的校验
教学导航
教学目标 | 了解JSP的简单的使用 掌握Cookie的使用 掌握Session的使用 |
教学方法 | 案例驱动法 |
1.1 记录用户的上次访问时间:
1.1.1 需求:
用户登录以后,记录上次访问时间.在用户下次登录的时候显示上次的登录的时间.
1.1.2 分析:
1.1.2.1 技术分析:
【会话技术】
一次会话:用户打开浏览器访问一个页面开始,多次访问页面,到最后关闭浏览器的过程称为是一次会话.
【为什么要使用会话】
【常见的会话技术】
- Cookie
是一种客户端的技术,将数据保存到客户端浏览器的内存中.
- Session
是一种服务器端技术,将数据保存到服务器端.
【JSP技术】
SUN公司提供了一套动态网页技术.Servlet/JSP.
为什么有Servlet之后,还要有JSP技术.JSP:Java Server Pages.
Servlet缺点:
* 需要配置.
* 显示数据,显示表单...非常麻烦.
提供了一个动态网页开发技术:JSP.
JSP = JSP自身东西 + HTML + Java代码.
【JSP的执行的原理】
JSP本身就是一个Servlet.在执行的时候翻译成一个Servlet.将Servlet编译成一个class文件.
【JSP的脚本-----嵌入Java代码】
<%! %> :JSP声明. 翻译成Servlet的成员的东西.在声明当中定义 类,方法,变量. Servlet本身是单例的.定义成员属性的话容易引发线程安全问题.
<% %> :JSP脚本. 翻译成Servlet的service方法内部的东西. 在脚本中定义 类,变量,语句
<%= %> :JSP表达式. 翻译成Servlet的service方法内部的out.print()中的内容.
1.1.2.2 步骤分析:
- 步骤一:在CountServlet中编写代码.
- 步骤二:获得从客户端带过来的所有的Cookie.
- 步骤三:从客户端带过来的所有的Cookie中查找指定名称的Cookie.
- 步骤四:判断是否是第一次访问:
n 如果没有查找到:就是第一次访问
u 显示欢迎
n 如果查找到:不是第一次访问
u 显示上次访问时间
- 步骤五:记录当前的时间,回写到浏览器.
1.1.3 代码实现:
/**
* Ø步骤一:在CountServlet中编写代码.
Ø步骤二:获得从客户端带过来的所有的Cookie.
Ø步骤三:从客户端带过来的所有的Cookie中查找指定名称的Cookie.
Ø步骤四:判断是否是第一次访问:
n如果没有查找到:就是第一次访问
u 显示欢迎
n如果查找到:不是第一次访问
u 显示上次访问时间
Ø步骤五:记录当前的时间,回写到浏览器.
*/
Cookie[] cookies = request.getCookies(); // Cookie
// 调用工具查找指定名称的Cookie:
Cookie cookie = CookieUtils.findCookie(cookies, "lastVisited");
// 判断:
if(cookie == null){
// 第一次访问
response.getWriter().println("<h1>您是第"+count+"位登录成功的用户!欢迎登陆本网站!</h1>");
}else{
// 不是第一次
// 获得上次访问时间:
long lastVisited = Long.parseLong(cookie.getValue());
Date date = new Date(lastVisited);
response.getWriter().println("<h1>您是第"+count+"位登录成功的用户!上次访问时间为:"+date.toLocaleString()+"</h1>");
}
long time = System.currentTimeMillis();
// 回写到浏览器:
Cookie c = new Cookie("lastVisited",""+time);
response.addCookie(c);
1.1.4 总结:
1.1.4.1 Cookie的使用的总结:
【Cookie的使用的小结】
// 获得Cookie:
Cookie[] request.getCookies();
// 向浏览器回写Cookie:
response.addCookie(Cookie cookie);
// 构造Cookie
Cookie(String name,String value);
【Cookie的分类】
会话级别Cookie:默认的.关闭浏览器Cookie就会被销毁.
持久级别Cookie:将Cookie保存到本地的硬盘上.
Cookie的API:
* String getName();
* String getValue();
* void setDomain(String str);
* 设置Cookie有效域名.
* void setPath(String str);
* 设置Cookie的有效路径. setPath(“/WEB11”);
* void setMaxAge(int maxAge);
* 设置Cookie的有效时长. setMaxAge(0); --- 删除持久的Cookie.(有效路径必须一致.)
【Cookie的注意事项】
Cookie保存的时候一个浏览器上对Cookie的个数和大小都是由限制的.
Cookie默认不能保存中文.
* URLEncoder.encode();
* URLDecoder.decode();
1.2 完成商品浏览记录的显示:
1.2.1 需求:
在浏览购物网站上的商品的时候,将浏览记录记录下来.
1.2.2 分析:
1.2.2.1 技术分析:
使用Cookie技术:将商品的ID保存到Cookie中回写到浏览器.下次访问的时候,带着Cookie信息.可以从Cookie中获得商品的ID.显示.
使用持久的Cookie.
1.2.2.2 步骤分析:
- 步骤一:设计商品列表页面:
- 步骤二:修改图片的链接地址:提交到Servlet:
- 步骤三:在Servlet中接收参数:
- 步骤四:查找指定名称的Cookie:
- 步骤五:判断是否是第一次浏览:
n 如果是第一次:
u 将id放入到Cookie回写.
n 如果不是第一次:
u 判断点击商品是否已经在浏览记录中
l 如果已经在浏览记录中:
n 删除当前的商品在浏览记录中的位置
n 将商品的ID添加到列表之前.
l 如果商品没有在浏览记录中:
n 判断长度超过6个
u 移除最后一个
u 将商品ID添加到第一个位置
n 没有超过六个
u 将商品ID添加到第一个位置
u 获得列表中的所有的ID的值存入到Cookie回写到浏览器
- 步骤六:在页面中获得Cookie中存的ID的值,找到对应的图片并且显示.
1.2.3 代码实现:
/**
* 商品浏览记录的Servlet:
*/
public class VisitServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收参数:
String id = request.getParameter("id");
// 2.查找指定名称的Cookie:
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.findCookie(cookies, "history");
// 3.判断是否是第一次浏览商品
if(cookie == null){
// 是第一次的话:
Cookie c = new Cookie("history",id);
c.setPath("/WEB11");
c.setMaxAge(7*24*60*60);
response.addCookie(c);
}else{
// 不是第一次 2,1
// 从Cookie中获得原来的存的ID的值.
String value = cookie.getValue();// 2,1
// 因为数组 交换数组位置的时候比较麻烦的 将数组转成LinkedList:
// Arrays.asList(value.split(","));
LinkedList<String> list = new LinkedList<String>(Arrays.asList(value.split(",")));
// 判断商品是否浏览过.
if(list.contains(id)){
// 说明之前浏览过该商品 // 2,1 ---> 1,2
list.remove(id);
list.addFirst(id);
}else{
// 说明之前没有浏览过该商品 // 2,1 ---> 3,2,1
if(list.size() >= 3){
// 超过3个 3,2,1 ---> 4,3,2
list.removeLast();
list.addFirst(id);
}else{
// 没有超过3个
list.addFirst(id);
}
}
// 将List中的值 转成一个字符串.
StringBuffer sb = new StringBuffer();
for(String pid:list){
sb.append(pid+",");
}
// 删除最后一个逗号. 4,3,2,
String v = sb.toString().substring(0, sb.length()-1);
Cookie c = new Cookie("history",v);
c.setPath("/WEB11");
c.setMaxAge(7*24*60*60);
response.addCookie(c);
}
// 页面跳转
request.getRequestDispatcher("/product_info.htm").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.2.4 总结:
1.2.4.1 清空浏览记录:
public class ClearHistoryServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置Cookie有效路径和有效时长 设置0;
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.findCookie(cookies, "history");
// Cookie cookie = new Cookie("history",null);
cookie.setPath("/WEB11");
cookie.setMaxAge(0);
response.addCookie(cookie);
// 页面跳转:
// request.getRequestDispatcher("/productList.jsp").forward(request, response);
response.sendRedirect("/WEB11/productList.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.3 将商品添加到购物车:
1.3.1 需求:
在商品详情页面点击添加到购物车!将商品加入购物车!!
1.3.2 分析:
1.3.2.1 技术分析
【Session会话】
Cookie有大小和个数的限制的.
而且Cookie数据保存在客户端数据.
Session保存在服务器端,没有大小的限制.
1.3.2.2 步骤分析:
步骤一:点击加入购物车的链接的时候.提交到Servlet
步骤二:在Servlet中接收商品的ID.
步骤三:是否是第一次往购物车中添加商品.
* 是第一次:
* 创建一个购物车
* 将商品添加到购物车
* 不是第一次:
* 获得购物车:
* 判断购物车中是否已经存在该商品.
* 已经存在:
* 获得原来的数量+1
* 将商品和对应的数量存入到购物车
* 不存在:
* 将商品和商品对应的数量1存入到购物车.
步骤四:页面跳转
1.3.3 代码实现:
public class CartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.接收商品的ID
String id = request.getParameter("id");
String[] names = {"大毛衣","毛呢大衣"};
String name = names[Integer.parseInt(id)-1];
// 2.判断是否是第一次购物:
// 获得session,从session中获得购物车:
Map<String, Integer> cart = (Map<String, Integer>) request.getSession().getAttribute("cart");
if(cart == null){
// 第一次购物
// 创建购物车:
cart = new LinkedHashMap<String,Integer>();
// 将商品和对应的数量存入到购物车.
cart.put(name, 1);
}else{
// 不是第一次购物
// 判断购物车中是否已经存在该商品.
if(cart.containsKey(name)){
// 购物车中已经包含该商品
Integer count= cart.get(name);
count++;
cart.put(name, count);
}else{
// 购物车中没有包含该商品
cart.put(name, 1);
}
}
request.getSession().setAttribute("cart", cart);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("<h1><a href='/WEB11/productList.jsp'>继续购物</a> | <a href='/WEB11/cart.jsp'>去购物车结算</a></h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.3.4 总结:
1.3.4.1 【清空购物车】
public class ClearCartServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getSession().removeAttribute("cart");
response.sendRedirect("/WEB11/cart.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
1.3.4.2 【Session域对象】
ServletContext :适合共享数据.
* 生命周期:
* 服务器启动的时候创建.
* 服务器关闭的时候销毁.
* 作用范围:
* 整个web应用.
HttpSession :私有的数据.登录用户的信息.
* 生命周期:
* 服务器端第一次调用getSession()方法时候.才会创建一个session对象.
* session销毁三种情况:
* session过期:默认过期时间30分钟.
* 非正常关闭服务器:(正常关闭服务器 序列化到硬盘)
* 调用session.invalidate();
* 作用范围:
* 多次请求(一次会话)
HttpServletRequest :
* 生命周期:
* 客户端向服务器发送请求的时候,服务器创建一个请求对象.
* 服务器对这次请求作出响应之后.请求对象就会被销毁.
* 作用范围:
* 一次请求
1.4 一次性验证码校验
1.4.1 需求:
在网站登录的时候,生成一个验证码.登录的时候对验证码进行校验.
1.4.2 分析:
1.4.2.1 步骤分析:
步骤一:生成验证码的时候,将随机产生的4个字母或数字存入到session中。
步骤二:在页面中输入一个验证码点击登录.提交到Servlet
步骤三:在Servlet中获得页面提交的验证码和session中验证码比较
步骤四:将session中存的验证码清空
步骤五:如果不一致返回登录页面.
步骤六:如果一致,再去比较用户名和密码