Cookie&Session

1. 会话技术

    1.1 一次会话

    用户打开浏览器访问一个页面开始,多次访问页面,到最后关闭浏览器的过程称为是一次会话

  1.2 常用的会话技术

 

      cookie:是一种客户端技术,将数据保存在浏览器的内存中。

        session:是一种服务器技术,将数据保存在服务器端。

       1.3 JSP执行原理

        JSP本身就是一个Servlet.在执行的时候翻译成一个Servlet.将Servlet编译成一个class文件

  1.4 JSP脚本

       <%!   %> :JSP声明.  翻译成Servlet的成员的东西.在声明当中定义 类,方法,变量.  Servlet本身是单例的.定义成员属性的话容易引发线程安全问题.

     <%    %> :JSP脚本.  翻译成Servlet的service方法内部的东西. 在脚本中定义 类,变量,语句

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

2. 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默认不能保存中文.
* URLEncoder.encode();
* URLDecoder.decode();

  案列演示:用户登录欢迎界面

/**
步骤一:在CountServlet中编写代码.
步骤二:获得从客户端带过来的所有的Cookie.
步骤三:从客户端带过来的所有的Cookie中查找指定名称的Cookie.
步骤四:判断是否是第一次访问:
       如果没有查找到:就是第一次访问
           显示欢迎 
           如果查找到:不是第一次访问
           显示上次访问时间
           步骤五:记录当前的时间,回写到浏览器.
 */
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);

  案例演示:浏览商品历史记录

/**
 * 商品浏览记录的Servlet:
 */
public class VisitServlet extends HttpServlet implements Serializable {
    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);
    }
}

  案例演示:删除浏览记录

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);
    }

}

3.session的使用

  cookie保存在客户端,大小和数量有限制,而session保存在服务器端,没有限制。

  生命周期:服务器启动的时候创建、服务器关闭的时候销毁。

  作用范围:整个web应用.

 

  HttpSession :私有的数据.登录用户的信息.

  生命周期:服务器端第一次调用getSession()方法时候.才会创建一个session对象.

 

       session销毁三种情况:session过期:默认过期时间30分钟;非正常关闭服务器:(正常关闭服务器 序列化到硬盘);调用session.invalidate();

 

  案例演示:将商品添加到购物车

public class CartServlet extends HttpServlet imple...{
    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);
    }

}

  案列演示:清空购物车 

public class ClearCartServlet extends HttpServlet implements....{
    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);
    }

}

 

 

 

 

 

 

 

 

 

  

 

posted on 2018-10-29 15:44  岁月磨平青春的棱角  阅读(137)  评论(0)    收藏  举报

导航