36.1 Cookie入门、创建多个Cookie、保存时间、共享问题、共享问题、Cookie的特点和作用、案例:记住上一次访问时间

目录

1 Cookie快速入门

2 创建多个Cookie并发送

3 cookie保存时间

4 cookie共享问题

4.1 cookie存中文

4.2 cookie共享问题

5 Cookie的特点和作用

6 案例:记住上一次访问时间


1 Cookie快速入门

概念:客户端会话技术,将数据保存到客户端

Cookie 使用步骤     1. 创建Cookie对象,绑定数据            * new Cookie(String name, String value) 
     2. 发送Cookie对象            * response.addCookie(Cookie cookie) 
     3. 获取Cookie,拿到数据            * Cookie[]  request.getCookies()  
@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("cookie1","hello");//1 创建Cookie对象
        resp.addCookie(cookie);// 2 发送Cookie
    }
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();//3 获取Cookie
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+value);
            }
        }
    }
}

Cookie实现原理:基于响应头set-cookie和请求头cookie实现

2 创建多个Cookie并发送

可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可

@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //一次创建多个Cookie并发送
        Cookie cookie = new Cookie("cookie2", "www.xxx1.com");
        Cookie cookie1 = new Cookie("cookie3", "www.xxx2.com");
        resp.addCookie(cookie);
        resp.addCookie(cookie1);

    }
}
@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();//3 获取Cookie
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name+value);
            }
        }

    }
}

3 cookie保存时间

默认情况下,当浏览器关闭后,Cookie数据被销毁

持久化存储

setMaxAge(int seconds)

1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("cookie4", "www.xxx4.com");
        //2.设置cookie的存活时间
        //c1.setMaxAge(30);//将cookie持久化到硬盘,30秒后会自动删除cookie文件
        //c1.setMaxAge(300);
        //c1.setMaxAge(-1);//默认值
        cookie.setMaxAge(0);//删除cookie信息
        resp.addCookie(cookie);
    }

4 cookie共享问题

4.1 cookie存中文

  • 在tomcat 8 之前 cookie中不能直接存储中文数据。需要将中文数据转码---一般采用URL编码(%E3)
  • 在tomcat 8 之后,cookie支持中文数据。特殊字符还是不支持,建议使用URL编码存储,URL解码解析

4.2 cookie共享问题

     1. 假设在同一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
          默认情况下cookie不能共享,如果要共享,则设置 setPath(String path):
          setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录,可以将path设置为"/"

@WebServlet("/cookieDemo5")
public class CookieDemo5 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("cookie5", "www.xxx4.com?name=张三");//存储中文数据
        cookie.setPath("/");//正同一个tomcat服务器中实现数据共享
        resp.addCookie(cookie);

    }
}

2. 不同的tomcat服务器间cookie共享问题?
           setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
           如 setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

5 Cookie的特点和作用

    1. cookie存储数据在客户端浏览器
    2. 浏览器对于单个cookie 的大小有限制(4kb) 以及, 对同一个域名下的总cookie数量也有限制(20个)

Cookie作用:
        1. cookie一般用于存出少量的不太敏感的数据
        2. 在不登录的情况下,完成服务器对客户端的身份识别

6 案例:记住上一次访问时间

需求:
        1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
        2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串

分析:
        1. 可以采用Cookie来完成
        2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie
            a 有:不是第一次访问
                1. 响应数据:欢迎回来,您上次访问时间为:xxxx年x月xx日11:50:20
                2. 写回Cookie:lastTime=xxxx年x月xx日11:50:20
            b 没有:是第一次访问
                1. 响应数据:您好,欢迎您首次访问
                2. 写回Cookie:lastTime=xxxx年x月xx日11:50:20

@WebServlet("/cookieDemo6Test")
public class CookieDemo6Test extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/http;charset=utf-8");//1设置响应的消息体的数据格式以及编码
        //2 获取所有Cookie
        Cookie[] cookies = req.getCookies();
        boolean flag=false;//没有名称为lastTime的cookie
        //3 cookie存在则遍历Cookie数组
        if(cookies!=null&&cookies.length>0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if("lastTime".equals(name)){
                    flag=true;//有名称为lastTime的cookie
                    Date date = new Date();//获取当前时间
                    //日期格式化
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String format = sdf.format(date);//日期转化为字符串形式
                    String encode = URLEncoder.encode(format, "utf-8");//字符串进行URL编码
                    cookie.setValue(encode);
                    cookie.setMaxAge(3600*24*30);//设置cookie存活30天
                    resp.addCookie(cookie);

                    // 获取cookie值
                    String value = cookie.getValue();

                    String decode = URLDecoder.decode(value, "utf-8");//url解码
                    System.out.println(decode);
                    resp.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+decode+"</h1>");
                    break;
                }
            }
        }
        //4 cookie不存在则建立cookie
        if(cookies==null||cookies.length==0||flag==false){
            Date date=new Date();//获取当前日期
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = sdf.format(date);
            String encode = URLEncoder.encode(format, "utf-8");
            Cookie cookie = new Cookie("lastTime",encode);
            cookie.setMaxAge(3600*24*30);//设置cookie存活30天
            resp.addCookie(cookie);
            resp.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页