A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

[技术笔记] Cookie和Session

© GY_qiyue 初级黑马   /  2018-7-3 10:09  /  567 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1.Cookie
  • 会话技术
    用户打开一个浏览器访问页面,访问网站的很多页面,访问完成后将浏览器关闭的过程称为是一次会话。
    常见的会话技术:
    • Cookie:将数据保存到客户端浏览器
    • Session:将数据保存到服务器端

    私有的数据、购物信息等数据会保存在会话技术中
  • Cookie技术的使用
    • 向浏览器保存数据:
      HttpServletResponse可以调用方法:
      ​        void  addCokie(Cookie cookie);
    • 获得浏览器带过来的Cookie:
      HttpServletRequest有一个方法:
      ​        Cookie[]  getCookies();
    • 创建一个Cookie对象:
      Cookie(String name, String value);
    • Cookie的常用API:
      • getName():获取cookie的名称
      • getValue():获取cookie的值
      • setPath(String path):设置cookie的有效路径,浏览器访问的路径包含该path,浏览器就会自动携带cookie发送到服务器,反之就不会
      • setMaxAge(int maxAge):设置Cookie的有效时间   --- 单位是秒

    • Cookie的分类:
      • 会话级别的Cookie:默认的Cookie,关闭浏览器cookie就会消失
      • 持久级别的Cookie:可以设置Cookie的有效时间,那么关闭浏览器Cookie还会存在

    • 删除Cookie:
      • 创建一个同名的cookie
        new  Cookie("cookie名","XXX");
      • 设置cookie的有效访问路径(与要删除的cookie路径保持一致)
        cookie.setPath(/路径名);
      • 设置cookie的有效时间---0
        cookie.setMaxAge(0);
      • 返回浏览器
        response.addCookie(cookie);


  • 案例:
    获取用户上次登录的时间

    //获取cookie
    Cookie[] cookies = request.getCookies();
    Cookie cookie = CookieUtils.getCookie(cookies, "lastTime");
    if(cookie == null){
        //用户第一次登录
        response.getWriter().println("您是第"+count+"位登录的会员");
    }else{
        //用户再次登录
        response.getWriter().println("您是第"+count+"位登录的会员,"+"您上次登录时间是:"+cookie.getValue());
    }
    Cookie cookie2 = new Cookie("lastTime",new Date().toLocaleString());
    //设置cookie有效时间
    cookie2.setMaxAge(60*60);
    //返回浏览器--向浏览器保存数据
    response.addCookie(cookie2);
    记录用户的浏览信息
    //接收商品的id
    String id = request.getParameter("id");
    //获得所有的cookie
    Cookie[] cookies = request.getCookies();
    //是否是第一次浏览商品
    Cookie cookie = CookieUtils.getCookie(cookies, "history");
    if(cookie == null){
        Cookie c = new Cookie("history",id);
        c.setMaxAge(60*60*24);
        c.setPath("/web16");
        response.addCookie(c);
    }else{
        //是否是第一次浏览该商品
        String value = cookie.getValue();
        String[] strs = value.split("-");
        //把字符串数组转化成LinkedList集合--方便操作数据
        LinkedList<String> linkedlist = new LinkedList<String>(Arrays.asList(strs));

        if(linkedlist.contains(id)){
            //浏览过该商品
            linkedlist.remove(id);
            linkedlist.addFirst(id);
        }else{
            //未浏览过该商品

            if(linkedlist.size()<3){
                //没有超过最大长度
                linkedlist.addFirst(id);
            }else{
                //已达到最大长度
                linkedlist.removeLast();
                linkedlist.addFirst(id);
            }
        }

        //内容修改后,要返回
        StringBuffer sb = new StringBuffer();
        for (String list : linkedlist) {
            sb.append(list+"-");
        }
        String s = sb.toString().substring(0,sb.length()-1);

        Cookie c = new Cookie("history",s);
        c.setPath("/web16");
        c.setMaxAge(60*60*24);
        response.addCookie(c);
    }
2. Session
  • Session概述
    • 服务器端会话技术,将数据保存在服务器端,并且没有大小和个数的限制,而Cookie是有限制的
    • Session的执行原理:基于Cookie的
    • 使用Session:
      • 创建/获取:
        request.getSession();
      • 设置session:
        setAttribute(String name, Object value);
      • 获取session值:
        Object getAttribute(String name);
      • 移除:
        removeAttribute(String name);


  • 案例:将商品加入购物车

    //session Map<String,Integer>购物车  名字和数量
    //响应编码格式
    response.setContentType("text/html;charset=utf-8");
    //接收get方式提交的商品名称
    String name = request.getParameter("name");
    //中文处理
    name = new String(name.getBytes("iso-8859-1"),"utf-8");
    //先看购物车里有没有商品
    HttpSession session = request.getSession();
    Map<String,Integer> map = (Map<String,Integer>)session.getAttribute("ket");
    if(map == null){
        //购物车为空
        map = new LinkedHashMap<String,Integer>();
        map.put(name, 1);
    }else{
        //购物车不为空
        if(map.containsKey(name)){
            //购物车已有此商品
            int count = map.get(name);
            count++;
            map.put(name, count);
        }else{
            //购物车没有此商品
            map.put(name, 1);
            }
    }
    4. 将购物车信息,保存到session中
    session.setAttribute("ket", map);
  • Session域对象
    • 创建:服务器第一次调用getSession()创建session
    • 销毁:三种情况销毁session:
      • session过期:默认过期时间为30分钟
      • 非正常关闭服务器。如果正常关闭关闭服务器,session序列化到硬盘
      • 手动调用session.invalidate().

    • 作用范围:多次请求---一次会话

  • 案例:一次性验证码
    校验程序


String code = request.getParameter("code");
String codeImg = (String)request.getSession().getAttribute("code");
//清除code--防止重复提交
request.getSession().removeAttribute("code");
if(!code.equalsIgnoreCase(codeImg)){
    request.setAttribute("err", "验证码错误,请重试!!!");
    //请求转发
    request.getRequestDispatcher("/login/login.jsp").forward(request, response);
}else{
...
​        使用js控制图片切换
<script type="text/javascript">
        function changeImg(){
            document.getElementById("img1").src="/web16/CheckImgServlet?time="+new  
                Date().getTime();
        }
</script>


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马