Web 基础12 会话技术及其Cookie对象入门

1.1 会话技术简介

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

1.1.1 会话技术作用

  • 会话技术可以保存用户在会话过程中所产生的数据

  • 会话技术也可以让用户在同一个会话中实现数据的共享

  • 会话应用场景的思路风暴

  • 想保存数据到购物车 不重要 个人私有

    • 保存哪里 服务器? 数据库 淘宝 京东 不登录
    • 编程最重要的域对象 域对象 临时存储数据
      • 浏览器

        • 可能会被清掉 服务器怎么知道浏览器里面有购物车数据
        • 每次访问服务器的时候把这个数据给带过去
      • 服务器

        • 占用空间 弄混 我怎么识别这个数据是谁的
        • 我怎么让用户证明这个数据是他的
      • 存在浏览器,主要问题是带来带去 存服务器主要问题是

      • 我要识别这个数据是谁的

      • 归根到底: 会话技术就是用来临时保存数据的

1.1.12 会话技术分类

  • cookie

    • cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set- cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,
    • 当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
  • session

    • session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,
    • 由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
    • session对象也是一个域对象,范围是整个会话
  • 注意:

    • cookie 把数据保存在用户的硬盘上
    • session 把数据保存在服务器的内存上
  • 会话: 打开淘宝--浏览--关闭 一个会话

    • cookie
      • 存在浏览器
        • 服务器先创建出来
        • 随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求在带回去
      • 优点:
        • 减少服务器的压力,服务器内存可以少用一点
      • 缺点:
        • 换一个浏览器就获取不到
        • 随时都会被清理,适合保存不重要的东西
        • 带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时候很长
        • 数据传来传去, 不安全
      • 总结: 不必要的,比较小的,不涉及安全性的内容,用cookie
    • session
      • 存在服务器
      • session 就是一个域对象,(setAttribute getAttribute,removeAttribute),就是通过这个保存数据

1.2 Cookie 常用方法

1.2.1 Cookie的方法

方法 描述
Cookie(String name, String value) Constructs a cookie with a specified name and value.
void setMaxAge(int expiry) Sets the maximum age of the cookie in seconds.
void setPath(String uri) Specifies a path for the cookie to which the client should return the cookie.
String getName() Returns the name of the cookie.
String getValue() Returns the value of the cookie.

1.2.2 关于Cookie对象的方法

Cookie[] cs = request.getCookies();

得到的是一个数组,通过遍历可以得到自己想要的Cookie信息

添加Cookie对象

response.addCookie(c);

其中参数c 为cookie对象

设置有效时间

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

设置路径

void setPath(String uri)//雾霾 江苏  南京市 上海 
当用户访问这个路径下的web资源,或者是这个路径下子路径的资源,他都会自动携带这个cookie
cookie.setPath("/myCookie");//cookie的默认路径是当前WEB应用的根路径
cookie.setPath(request.getContextPath());//推荐使用这个方法,比较灵活

1.2.3 关于Cookie的一些细节

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

1.3 Cookie 入门案例

图解

记录用户上次访问时间分析.png

1.3.1 记录用户上次的访问时间

思路整理

  • 拿到指定的cookie信息
  • 判断是否为null
    • 如果为null,给出提示信息
    • 否则,获取上次的访问时间,并显示
  • 获得当前的时间存在cookie当中,发到客户端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //记录用户上次的访问时间
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        //获取cookie信息
        Cookie[] cs = request.getCookies();
        
        if(cs != null) {
            for (int i = 0; i < cs.length; i++) {
                String name = cs[i].getName();
                if("lastAccessTime".equals(name)) {
                    cookie = cs[i];
                    break;
                }
            }
        }
        
        //判断是否有上次的访问时间
        if(cookie == null) {
            //如果没有上次的访问时间,需要给出提示信息
            out.println("欢迎第一次访问");
        }
        else {
            //如果有上次的访问时间,需要获取上次的访问时间并显示
            String value = cookie.getValue();
            out.println("您上次的访问时间为:" + value);
        }
        
        
        
        
        //获取这次的访问时间(当前的系统时间)
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String now = sdf.format(new Date());
        
        //创建Cookie对象
        Cookie c = new Cookie("lastAccessTime",now);
        //记录用户这次的访问时间,并发送至客户端
        response.addCookie(c);
         
    }

1.3.2 记住用户名

登录页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        Cookie[] cs = request.getCookies();
        Cookie cookie = CookieUtils.getCookie(cs, "username");
        String username = "";
        String checked = "";
        
        if (cookie != null) {
            username = cookie.getValue();
            checked = "checked = 'checked'";
        }
        
        out.println("<html>");
        out.println("<head>");
        out.println("<title>登录页面</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<form action='/myCookie/LoginServlet' method='post'>");
        out.println("用户名:<input type='text' name='username' value='"+username+"' />");
        out.println("<br />");
        out.println("密码:<input type='text' name='password' />");
        out.println("<br />");
        out.println("<input type='submit' value='登录' />");
        out.println("<input type='checkbox' name='remember' value='1'"+checked+" />记住用户名");
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");

    }

跳转页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        out.println("<h1>我是首页</h1>");
    }

处理页面

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置响应类型和编码
        response.setContentType("text/html;charset=UTF-8");
        //获取输出流对象
        PrintWriter out = response.getWriter();
        
        //获取用户名
        String username = request.getParameter("username");
        //获取密码
        String password = request.getParameter("password");
        //获取复选框记住用户名的值
        String remember = request.getParameter("remember");
        
        System.out.println(username);
        System.out.println(password);
        
        //判断用户名和密码是否有效
        if ("itcast".equals(username) && "123456".equals(password)) {
            //登录成功
            out.println("登录成功,3秒后跳转首页");
            response.setHeader("Refresh", "3;URL=/myCookie/IndexServlet");
            
            if ("1".equals(remember)) {
                //需要记住用户名
                //创建Cookie对象
                Cookie cookie = new Cookie("username", username);
                //设置cookie的有效时间
                cookie.setMaxAge(Integer.MAX_VALUE);
                //发送cookie至客户端
                response.addCookie(cookie);
            }else {
                //不需要记住用户名
                Cookie cookie = new Cookie("username", "");
                cookie.setMaxAge(0);
                response.addCookie(cookie);
            }
            
        }else {
            //登录失败
            out.println("用户名或者密码错误,3秒后跳转到登录页面");
            response.setHeader("Refresh", "3;URL=/myCookie/LoginUIServlet");
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,045评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,114评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,120评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,902评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,828评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,132评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,590评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,258评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,408评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,335评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,385评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,068评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,660评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,747评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,967评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,406评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,970评论 2 341

推荐阅读更多精彩内容