美文网首页
Servlet五——Cookie

Servlet五——Cookie

作者: 嗷老板 | 来源:发表于2018-04-08 17:21 被阅读0次

    一、会话技术的概述

      会话技术可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,这样的整个过程我们称为一个会话。

    1、会话的作用

    • 会话技术可以保存用户在会话过程中所产生的数据
    • 会话技术也可以让用户在同一个会话中实现数据的共享
        我们平常在浏览网页的时候一些不太重要信息,例如:上次访问的时间、记住用户名等,都可以使用会话技术存储,简单来讲会话技术就是用来临时保存数据的。

    2、会话技术的分类

    • Cookie
        cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set-cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
        cookie存在浏览器,由服务器创建,随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求再带回去。
        优点:减少服务器的压力,服务器内存可以少用一点
        缺点:
          (1)换一个浏览器后cookie就无法获取;
          (2)随时都会被清理,适合保存不重要的东西;
          (3)带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时间很长;
          (4)数据传来传去,不安全
        总结:不必要的,比较小的,不涉及安全性的内容,用cookie
    • session
        session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,由于Session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
        session对象是一个域对象,通过setAttribute、getAttribute和removeAttribute保存查询删除数据。

    二、Cookie应用案例——记录用户上次访问的时间

    步骤:
      (1)获取指定的cookie信息
      (2)判断是否为null
        如果为null,给出提示信息
        否则获取上次访问时间,并显示
      (3)获取当前的时间存入cookie中,发到客户端

    package com.itheima.cookie;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class CookieDemo extends HttpServlet {
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //设置响应类型和编码
            response.setContentType("text/html;charset=UTF-8");
            //获取输出流
            PrintWriter out = response.getWriter();
            
            //获取cookie信息
            Cookie[] cookies = request.getCookies();
            Cookie cookie = null;
            
            if(cookies != null){
                for (int i = 0; i < cookies.length; i++) {
                    String name = cookies[i].getName();
                    if("lastAccessTime".equals(name)){
                        cookie = cookies[i];
                        break;
                    }
                }
            }
            
            //判断是否有上次访问时间
            if(cookie == null){
                //如果没有上次的访问时间,需要给出提示信息
                out.println("欢迎第一次访问");
            }else{
                //如果有上次访问的时间,获取上次访问时间,并显示
                String value = cookie.getValue();
                out.print("您上次访问的时间为"+value);
            }
            
            //获取本次访问的时间
            SimpleDateFormat sdf= new SimpleDateFormat("yy-MM-dd HH:mm:ss");
            String now = sdf.format(new Date());
            
            //创建cookie对象
            Cookie c = new Cookie("lastAccessTime", now);
            //记录用户访问时间,发送至客户端
            response.addCookie(c);
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
            doGet(request, response);
        }
    
    }
    
    第一次访问
    再次访问

    案例的优化

      如果我们在获取指定cookie对象时,每次都要写遍历整个集合的代码,这样非常麻烦,我们可以将获取指定cookie对象的方法封装到一个工具类中,直接调用方法获取指定的cookie对象。
    CookieUtils

    import javax.servlet.http.Cookie;
    
    public class CookieUtils {
        private CookieUtils(){}
        
        public static Cookie getCookie(Cookie[] cookies,String name){
            Cookie cookie = null;
            if(cookies != null){
                for (int i = 0; i < cookies.length; i++) {
                    String cookieName = cookies[i].getName();
                    if(cookieName.equals(name)){
                        cookie = cookies[i];
                    }
                }
            }
            return cookie;
        }
    }
    

    改写案例

    import javax.servlet.http.Cookie;
    
    public class CookieUtils {
        private CookieUtils(){}
        
        public static Cookie getCookie(Cookie[] cookies,String name){
            Cookie cookie = null;
            if(cookies != null){
                for (int i = 0; i < cookies.length; i++) {
                    String cookieName = cookies[i].getName();
                    if(cookieName.equals(name)){
                        cookie = cookies[i];
                    }
                }
            }
            return cookie;
        }
    }
    

    三、Cookie的常用方法

    1、构造方法

      Cookie常用的构造方法有两个参数,对应cookie对象了name和value属性。

        Cookie(String name,String value);
    

    2、获取名称

      作用:获取cookie对象的name属性
      返回值:String类型的字符串

        String getName();
    

    3、获取值

      作用:获取cookie对象的value属性
      返回值:String类型的字符串

        String getValue();
    

    4、设置有效时间(过期时间)

      作用:设置cookie对象的有效时间,参数以毫秒为单位
      返回值:void

        //有效期一天
        cookie.setMaxAge(60 * 60 * 24);
        //当浏览器关闭,会话结束后cookie会自动的被删除
        cookie.setMaxAge(-1);
        //cookie会立刻被删除
        cookie.setMaxAge(0);
        //最长的有效时间
        cookie.setMaxAge(Integer.MAX_VALUE);
    

    5、设置路径

      作用:设置cookie对象的保存路径
      返回值:void

        //cookie的默认路径是当前WEB应用的根路径
        cookie.setPath("/myCookie");
        //推荐使用这个方法,比较灵活
        cookie.setPath(request.getContextPath());
    

    四、Cookie的细节

    • 一个cookie只能用来标识一种信息,而cookie至少需要包含这个信息的名称和值;
    • 一个网站可以向一个浏览器提供多个cookie,而一个浏览器也可以接收多个网站提供的cookie
    • 一个浏览器一般最多可以接受300个cookie,一个网站所对应的cookie最多为20个,一个cookie大小限制为4kb
    • 创建一个cookie对象,发送至客户端,那这个cookie他默认的级别是会话级别
        会话级别:当用户关闭浏览器,会话结束了,那这个cookie也被删除了
        如果需要把cookie保存在用户的硬盘上,需要设置cookie的有效时间(过期时间)
    • cookie的名称和值都不可以使用中文,因为中文被认为是不安全的字符

    相关文章

      网友评论

          本文标题:Servlet五——Cookie

          本文链接:https://www.haomeiwen.com/subject/knzfhftx.html