zoukankan      html  css  js  c++  java
  • 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中存的验证码清空

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

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

  • 相关阅读:
    使用过的一些前端工具
    文档和元素中与几何形状和滚动相关的属性和方法
    文档元素选取和遍历中的一些容易忘记的概念
    只存在于理想中的客户端JavaScript时间线
    JavaScript函数代码和执行上下文--ECMA-262-5
    JavaScript中的闭包
    Git Note
    HDOJ 4463 Outlets 最短路
    HDOJ 4548 美素数
    HDOJ 2544 最短路
  • 原文地址:https://www.cnblogs.com/Jixiangwei/p/7056653.html
Copyright © 2011-2022 走看看