Cookie 和 Session(HttpSession) 对象详解

前言 -------   每天都忙忙碌碌,感觉自己过得很充实很有意义,加油!加班终于完成!

Cookie对象

cookie饼干的意思,其实是一份小数据,是服务器发送给客户端,并保存在客户端的一份小数据,cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。

为什么使用Cookie

因为http请求是无状态的,当客户端第一次访问服务器的时候,服务器处理完之后响应给客户端。当第二次客户端访问的时候,服务器根本不会知道这个客户端以前来访问过,。为了更好的用户体验,更好的交互(自动登录),当客户端第二次访问的时候,服务器知道他来过。在公司的角度,是为了更好的手机用户的习惯,比如大数据。

Cookie用法

1、为响应添加Cookie

Cookie cookie = new Cookie("aa","bb");
Cookie cookie1 = new Cookie("kk","lll");
response.addCookie(cookie);
response.addCookie(cookie1);

2、客户端收到的头信息里面,多了一个字段  Set-Cookie  (响应端response)

3、获取Cookie

        //获取Cookie,返回一个Cookie数组
        Cookie[] cookies = request.getCookies();
        //判断第一次访问时候,cookies为空的情况,避免出现空指针
        if(cookies != null){
            for (Cookie c : cookies ){
                String name = c.getName();
                String value = c.getValue();
                System.out.println("name="+name+"  value="+value);
                System.out.println("哈哈");
            }
        }

Cookie的常用方法

//表示设置Cookie的生存日期,以秒为单位
//当前默认值是负数,-1 ,表示关闭浏览器,Cookie就会失效
//正值的话,以秒为单位
cookie.setMaxAge(78);

//给Cookie中的value赋予新值
cookie.setValue("ds");

//用于指定只有请求了指定的域名,才会带上Cookie
cookie.setDomain("baidu,com");

//只有访问在该域名下的DemoCookie的路径,才会带上Cookie
cookie.setPath("/DemoCookie");

Cookie分类

  • 会话Cookie

当浏览器关闭的时候就会失效,存储在内存上

  • 持久Cookie

设置Cookie失效的时间,以秒为单位。  Cookie.getMaxAge();

例子1:获取上次登录的时间

分析当用户第二次登录成功的时候,显示该用户上一次的登录时间

1、第一次登录设置cookie,存取当前时System.currentTimeMillis()+""

2、设置一个工具类,功能是传递一个Cookie数组,获得想的到的Cookie

3、第二次登录时候获取之前设置的cookie,并使其显示出来

4、更新Cookie

代码实现

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        response.setContentType("text/html;charset=utf-8");

        if("admin".equals(username) && "123".equals(password)){
            Cookie[] cookies = request.getCookies();
            Cookie c = CookieUtil.getCookie(cookies);
            if( c == null){ //第一次登录
                //添加Cookie
                Cookie cookie = new Cookie("last",System.currentTimeMillis()+"");
                response.addCookie(cookie);
                response.getWriter().write("欢迎您"+username);
            }else { //第二次访问
                //添加一个工具类,获得我们想要的Cookie
                long l = Long.parseLong(c.getValue());

                //响应客户端
                response.getWriter().write("欢迎您"+username+"  当前登陆的时间为:"+ new Date(l));

                //更新Cookie
                c.setValue(System.currentTimeMillis()+"");
                response.addCookie(c);
            }
        }else{
            response.getWriter().write("用户名或者密码不正确!");
        }
    }

例子2:商品的浏览记录

准备工作

  1. 拷贝第一天的 htmll原型文件,到工程的Web里面。

  2. 在Web目录下新建一个jsp文件, product_list.jsp, 然后拷贝原来product_list.html的内容到jsp里面。 建好之后,jsp里面的所有ISO-8859-1 改成 UTF-8

    拷贝html标签的所有内容。 替换jsp的html标签即可

  3. 修改product_info.htm里面的手机数码超链接地址

    <li class="active">手机数码(current)</li>

  4. 修改首页(index.html)顶部的手机数码跳转的位置为 product_list.jsp

    <li class="active">手机数码(current)</li>

分析过程:

代码实现:

      product_list.jsp文件

           

CookieOne(添加cookie,设置cookie)

CookieClear  (清除cookie,清除浏览记录)

Cookie的安全问题

cookie是储存在浏览器端的,不安全,大小有限制,浏览器应该支持每台 Web 服务器有 20 个 cookie,总共有 300 个 cookie,并且可能将每个 cookie 的大小限定为 4 KB。,因此,引出Session会话管理

HttpSession对象(session)

会话,一个浏览器打开一个工程就是一个会话,不同的浏览器打开的是不同的会话,会话,指用户登录网站后的一系列动作,比如浏览商品添加到购物车并购买。会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话

session是依赖于Cookie的一种会话机制,当建立一个session对象时候,请求中(request)就会有一个Cookie。

Cookie当不设置时间时,默认 -1 ,关闭浏览器Cookie失效,cookie是在内存上,只有设置时间,才会存储在硬盘上。

Cookie是服务器返回的一小段数据,并存储在客户端中,session是存储在服务器中的。

会话信息的范围仅限于当前 Web 应用程序 (ServletContext),因此存储在一个上下文中的信息在另一个上下文中不是直接可见的。

application  是相当于ServletContext,上下文 ,共享变量,所以不同的浏览器访问服务器都可以的到application设置的值。

Session对象创建

HttpSession session = request.getSession();   //创建Session对象

Session对象的销毁

因为session是将数据存储在服务器中的内存中的数据,当关闭浏览器session数据也不会消失。    (Redis)

1.关闭服务器

2.session会话过期,默认时间时30分钟。在30分钟内不发生新的请求,就会关闭

常用的方法

//获取sessionid
String id = session.getId();

//存值
session.setAttribute("name","value");

//获取值
String value = session.getAttribute("name");

//移除值
session.removeAttribute("name");

例子三:简单购物车,使用Session

案例分析:

代码实现:

product_list.jsp

CartServlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        //1、获取商品的id
        int id = Integer.parseInt(request.getParameter("id"));
        //获取商品的名字,公司中这里是查询数据库的,为了简单,建立一个数据,正好与id号对应
        String[] names = {"IphoneMax","小米6","华为9","华硕电脑","魅族","鞋靴箱包","阿迪达斯","耐克",};
        String name = names[id];

        HttpSession session = request.getSession();
        //2、Map<String, Integer>对应 商品名称  商品数量,
        Map<String , Integer> map = (Map<String, Integer>) session.getAttribute("cart");
        if(map == null){
            map = new LinkedHashMap<String , Integer>();
            session.setAttribute("cart",map);
        }

        //3、给购物车添加商品
        if (map.containsKey(name)){
            map.put(name,map.get(name)+1);
        }else{
            map.put(name,1);
        }

        //4、给客户端响应
        response.getWriter().write("<h3><a href='product_list.jsp'>继续添加商品</a></h3>");
        response.getWriter().write("<a href='cart.jsp'><h3>去购物车结算</h3></a>");
    }

cart.jsp (显示购物商品)

 <body>
    <%
      Map<String,Integer> map = (Map<String, Integer>) session.getAttribute("cart");
      if(map != null){  //必须写,否则清空购物车的时候会出现错误
    %>
    <h3>您购买的商品如下</h3>
    <%
      for (String key : map.keySet()){
    %>
        <h4>商品的名称:<%=key  %>  商品的数量:<%=map.get(key) %></h4>
    <%
      }
      }else {
    %>
    <h3>您没有任何商品</h3>
    <%
      }
    %>
    <h3><a href="clear">清空购物车</a></h3>
  </body>

SessionClear(清空购物车) 移除Session中的元素

猜你喜欢

转载自blog.csdn.net/weixin_44142032/article/details/88650810