JavaWeb 8 Cookie

   2. 会话管理入门    
        2.1 生活中会话
            我: 小张,你会跳小苹果码?
            小张: 会,怎么了?
            我: 公司年会上要表演节目,你教教我把
            小张:没问题,一顿饭而已。
            我: OK。
            。。。。。。。。

在这次生活中的会话中产生通话记录(会话数据)
        2.2 软件中的会话
        一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器

登录场景:
            打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)
                                                                修改密码(输入原密码)
                                                                 修改收货地址
                                                                .......

问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?

购物场景:
             打开浏览器 -> 浏览商品列表  -> 加入购物车(把商品信息保存下来)  -> 关闭浏览器
             打开浏览器->  直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付

问题: 在购物会话过程中,如何保存商品信息??

会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据。

域对象: 实现资源之间的数据共享。

request域对象
            context域对象
        
        登录场景:
            小张: 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页(显示“张三”)
            小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) ->     用户主页(显示“李四”)

问题: context是所有用户公有的资源!!!会覆盖数据。

小张: 输入“张三”(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示“张三”)                    
            问题: 一定要使用转发技术来跳转页面!!!

解决办法: 可以使用session域对象来保存会话数据!!!

2.3 会话技术
            Cookie技术:会话数据保存在浏览器客户端。
            Session技术:会话数据保存在服务器端。

3 Cookie技术
            3.1 特点
            Cookie技术:会话数据保存在浏览器客户端。
            3.2 Cookie技术核心
            Cookie类:用于存储会话数据

1)构造Cookie对象
                    Cookie( String name,  String value)
                2)设置cookie
                    void setPath( String uri)   :设置cookie的有效访问路径
                    void setMaxAge(int expiry) : 设置cookie的有效时间
                    void setValue( String newValue) :设置cookie的值
                3)发送cookie到浏览器端保存
                    void response.addCookie(Cookie cookie)  : 发送cookie
                4)服务器接收cookie
                    Cookie[] request.getCookies()  : 接收cookie

Code

package com.example.cookie;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//http://localhost:8080/Cookie/CookieDemo1
public class CookieDemo1 extends HttpServlet{

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        super.doPost(req, resp);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //1.创建Cookie对象
        Cookie cookie1 = new Cookie("name","eric");
        //Cookie cookie2 = new Cookie("email","jacky@qq.com");
        //Cookie cookie1 = new Cookie("email","eric@qq.com");

        /**
         * 1)设置cookie的有效路径。默认情况:有效路径在当前web应用下。 /day11
         */
        //cookie1.setPath("/day11");
        //cookie2.setPath("/day12");

        /**
         * 2)设置cookie的有效时间
         * 正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
            负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
            零:表示删除同名的cookie数据

         */
        //cookie1.setMaxAge(20); //20秒,从最后不调用cookie开始计算
        cookie1.setMaxAge(-1); //cookie保存在浏览器内存(会话cookie)
        //cookie1.setMaxAge(0);

        //2.把cookie数据发送到浏览器(通过响应头发送: set-cookie名称)
        //response.setHeader("set-cookie", cookie.getName()+"="+cookie.getValue()+",email=eric@qq.com");
        //推荐使用这种方法,避免手动发送cookie信息
        response.addCookie(cookie1);
        //response.addCookie(cookie2);
        //response.addCookie(cookie1);

        //3.接收浏览器发送的cookie信息
        /*String name = request.getHeader("cookie");
        System.out.println(name);*/
        Cookie[] cookies = request.getCookies();
        //注意:判断null,否则空指针
        if(cookies!=null){
            //遍历
            for(Cookie c:cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+"="+value);
            }
        }else{
            System.out.println("没有接收cookie数据");
        }

    }

}

3.3 Cookie原理
                1)服务器创建cookie对象,把会话数据存储到cookie对象中。
                        new Cookie("name","value");
                2)    服务器发送cookie信息到浏览器
                        response.addCookie(cookie);

举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)
                3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
                4)浏览器在下次访问服务器时,会带着cookie信息
                        举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)
                5)服务器接收到浏览器带来的cookie信息
                        request.getCookies();
        
            3.4 Cookie的细节
            1)void setPath( String uri)
            设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,
            那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。
            
            2)void setMaxAge(int expiry) : 设置cookie的有效时间。
                    正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
                    负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
                    零:表示删除同名的cookie数据
            3)Cookie数据类型只能保存非中文字符串类型的。
            可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,
            每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Code 删除Cookie

//http://localhost:8080/Cookie/DeleteCookie
public class DeleteCookie extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        /**
         * 需求: 删除cookie
         */
        Cookie cookie = new Cookie("name", "xxxx");
        cookie.setMaxAge(0);// 删除同名的cookie
        response.addCookie(cookie);
        System.out.println("删除成功");

    }

}

3.5 案例- 显示用户上次访问的时间

//用户上次访问时间 http://localhost:8080/Cookie/HistServlet
public class HistServlet extends HttpServlet {

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

        // 获取当前时间
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String curTime = format.format(new Date());

        // 取得cookie
        Cookie[] cookies = request.getCookies();
        String lastTime = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("lastTime")) {
                    // 有lastTime的cookie,已经是第n次访问
                    lastTime = cookie.getValue();// 上次访问的时间
                    // 第n次访问
                    // 1.把上次显示时间显示到浏览器
                    response.getWriter().write(
                            "欢迎回来,你上次访问的时间为:" + lastTime + ",当前时间为:" + curTime);
                    // 2.更新cookie
                    cookie.setValue(curTime);
                    cookie.setMaxAge(1 * 30 * 24 * 60 * 60);
                    // 3.把更新后的cookie发送到浏览器
                    response.addCookie(cookie);
                    break;
                }
            }
        }

        /**
         * 第一次访问(没有cookie 或 有cookie,但没有名为lastTime的cookie)
         */
        if (cookies == null || lastTime == null) {
            // 1.显示当前时间到浏览器
            response.getWriter().write("你是首次访问本网站,当前时间为:" + curTime);
            // 2.创建Cookie对象
            Cookie cookie = new Cookie("lastTime", curTime);
            cookie.setMaxAge(1 * 30 * 24 * 60 * 60);// 保存一个月
            // 3.把cookie发送到浏览器保存
            response.addCookie(cookie);
        }
    }

}

3.6 案例-查看用户浏览器过的商品

JavaWeb 8 Cookie的更多相关文章

  1. JavaWeb利用cookie记住账号

    JavaWeb利用cookie记住账号. 首先,来看看界面什么样子. 记住账号最普遍的做法,就是在点击登录时,将账号保存到cookie中. 材料准备 <script src="${ct ...

  2. JavaWeb学习----Cookie实现记住密码的功能

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  3. javaWeb 使用cookie显示商品浏览记录

    package de.bvb.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Date ...

  4. javaWEB与cookie

    Cookie1. Http协议与Cookie(了解)  * Cookie是HTTP协议制定的!先由服务器保存Cookie到浏览器,再下次浏览器请求服务器时把上一次请求得到Cookie再归还给服务器  ...

  5. JavaWeb中Cookie会话管理,理解Http无状态处理机制

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512995108961387015/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  6. JavaWeb基础: Cookie

    Cookie相关类: javax.servlet.http.Cookie 用于创建Cookie response 里通过addCookie方法添加Cookie到响应头 request里通过getCoo ...

  7. javaWeb 使用cookie显示上次访问网站时间

    package de.bvb.cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Date ...

  8. javaweb之Cookie篇

    Cookie是在浏览器访问某个Web资源时,由Web服务器在Http响应消息头中通过Set-Cookie字段发送给浏览器的一组数据. 一个Cookie只能表示一个信息对,这个信息对有一个信息名(Nam ...

  9. JavaWeb之Cookie和Session的区别

    Cookie和Session的区别 一.cookie机制和session机制的区别 ********************************************************** ...

随机推荐

  1. js笔记---封装一般运动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页)

    转载注明原地址:http://blog.csdn.net/nk_test/article/details/49497017 少年,作为苦练ACM,通宵刷题的你 是不是想着有一天能够荣登各大OJ榜首,俯 ...

  3. YTU 2296: KMP模式匹配 二(串)

    2296: KMP模式匹配 二(串) 时间限制: 1 Sec  内存限制: 128 MB 提交: 29  解决: 17 题目描述 输入一个主串和一个子串,用KMP进行匹配,问进行几趟匹配才成功,若没成 ...

  4. Task schedule 分类: 比赛 HDU 查找 2015-08-08 16:00 2人阅读 评论(0) 收藏

    Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. Javascript中setTimeout()的用法详解

    1.SetTimeOut()       1.1 SetTimeOut()语法例子       1.2 用SetTimeOut()执行Function       1.3 SetTimeout()语法 ...

  6. Android 编程下图片的内存优化

    1. 对图片本身进行操作 尽量不要使用 setImageBitmap.setImageResource. BitmapFactory.decodeResource 来设置一张大图,因为这些方法在完成 ...

  7. jquery easyui datagrid使用参考

    jquery easyui datagrid使用参考   创建datagrid 在页面上添加一个div或table标签,然后用jquery获取这个标签,并初始化一个datagrid.代码如下: 页面上 ...

  8. java安全令牌生成器

    SecureRandom sr = new SecureRandom(); byte[] bytes = new byte[8]; bytes = sr.generateSeed(8); System ...

  9. Java程序中调用Python脚本的方法

    在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后 ...

  10. Bad apple for CSharp

    前言:记得10年的时候我还在上学,有一天逛csdn看到了字符版的badapple,感觉这东西好NB啊,然后就下载了一份,最近整理博客就把他整理博客,原作者是谁真心不知道,这是在果壳看到的. Bad A ...