Cookie&Session

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脚本.  翻译成Servletservice方法内部的东西. 在脚本中定义 类,变量,语句

<%=   %> :JSP表达式. 翻译成Servletservice方法内部的out.print()中的内容.

1.1.2.2 步骤分析:

  • 步骤一:在CountServlet中编写代码.
  • 步骤二:获得从客户端带过来的所有的Cookie.
  • 步骤三:从客户端带过来的所有的Cookie中查找指定名称的Cookie.
  • 步骤四:判断是否是第一次访问:

n 如果没有查找到:就是第一次访问

显示欢迎

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保存到本地的硬盘上.

 

CookieAPI

* 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 如果是第一次:

id放入到Cookie回写.

n 如果不是第一次:

u 判断点击商品是否已经在浏览记录中

如果已经在浏览记录中:

n 删除当前的商品在浏览记录中的位置

将商品的ID添加到列表之前.

l 如果商品没有在浏览记录中:

判断长度超过6

u 移除最后一个

将商品ID添加到第一个位置

n 没有超过六个

将商品ID添加到第一个位置

获得列表中的所有的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中存的验证码清空

步骤五:如果不一致返回登录页面.

步骤六:如果一致,再去比较用户名和密码

原文地址:https://www.cnblogs.com/Jixiangwei/p/7056653.html