JavaWeb——Cookie和Session

Cookie

Cookie概述:

  1. Cookie显然不是它原意"饼干"的意思,可以称它为"小型文本文件",因为它储存的数据大小不超过4kb。
  2. Cookie是服务器通知客户端保存键值对的一种技术。
  3. 客户端有了Cookie 后,每次请求都发送给服务器。

Cookie的创建

  1. 创建Cookie对象
  2. 通过response.addCookie()方法通知客户端保存Cookie对象
protected void creatCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建cookie对象
        Cookie cookie = new Cookie("key1", "value1");
        //1.创建cookie对象
        Cookie cookie1 = new Cookie("key2", "value2");

        //2.通知客户端保存cookie
        resp.addCookie(cookie);
        //2.通知客户端保存cookie
        resp.addCookie(cookie1);
        resp.getWriter().write("Cookie创建成功!");
    }

Cookie的获取

服务器获取客户端的Cookie 只需要一行代码:requset.getCookies();得到Cookie数组

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie[] cookies = req.getCookies();

        Cookie iWantCookie = null;

        for (Cookie cookie : cookies) {
            //getName方法返回Cookie的key
            //getValue方法返回Cookie的value值
            resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");

        }


		//得到指定的Cookie键值对
        for (Cookie cookie : cookies) {
            if ("key2".equals(cookie.getName())) {

                iWantCookie = cookie;
                break;
            }
        }

        //如果不等于null,说明找到了需要的Cookie
        if (iWantCookie != null) {
            resp.getWriter().write("找到了需要的Cookie --> \"key3\" ");
        }
    }

Cookie值的修改

方式一:

  1. 先创建一个同"key"不同"value"的Cookie对象
  2. 调用response.addCookie( Cookie );通知客户端保存Cookie对象
   protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   	//方式一:
   	//1.先创建一个同"key"不同"value"的Cookie对象
       Cookie cookie = new Cookie("key1", "newValue1");
       
       //2.调用response.addCookie(cookie);通知客户度阿奴保存修改
       resp.addCookie(cookie);
       resp.getWriter().write("key1的Cookie已经修改完成!");
}

方式二:

1、先查找到需要修改的Cookie对象
2、调用setValue()方法赋于新的Cookie 值。
3、调用response.addCookie();通知客户端保存修改

	protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //方式二:
        //1.先查找需要修改的Cookie对象
        Cookie key2 = CookieUtils.findCookie("key2", req.getCookies());
        if (key2 != null) {
            //2.调用setValue()方法赋予新的Cookie值
            key2.setValue("newValue2");
            //3.调用response.addCookie(cookie);通知客户度阿奴保存修改
            resp.addCookie(key2);
            resp.getWriter().write("key2的Cookie已经修改完成!");
		}

Cookie的生命周期

控制Cookie生命周期可以管理Cookie什么时候被删除。

通过Cookie对象.setMaxAge()方法来设置Cookie的声明周期。

  • 方法参数为正数时,表示在指定的时间后过期(以秒为单位)。
  • 方法参数为负数,表示浏览器关闭时Cookie 就会被删除(默认值是-1)。
  • 方法参数为零,表示马上删除Cookie。
	//设置Cookie的生命周期为1小时
	protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("life3600", "life3600");
        cookie.setMaxAge(60 * 60);//设置cookie生命周期为1小时
        resp.addCookie(cookie);
        resp.getWriter().write("生命周期为1小时cookie “life3600” 已经创建");

    }

	//立即删除Cookie
    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.先找到你要删除的Cookie对象
        Cookie cookie = CookieUtils.findCookie("key2", req.getCookies());
        if (cookie != null) {

            //2.调用setMaxAge();
            cookie.setMaxAge(0);//立即删除cookie
            //3.调用response.addCookie(cookie);
            resp.addCookie(cookie);
            resp.getWriter().write("key2已经被删除");

        }
    }

	//Cookie的默认声明周期,即方法参数为负值
    protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("defaultLife", "defaultLife");
        cookie.setMaxAge(-1);//设置生命周期
        resp.addCookie(cookie);
        resp.getWriter().write("生命周期为1小时cookie “defaultLife” 已经创建");

    }

Cookie的path属性

Cookie的path属性可以有效的过滤在该路径下可以使用哪些Cookie。
path属性的值是页面地址。

 protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Cookie cookie = new Cookie("path1", "path1");
        //getContextPath() === > 得到 /工程路径
        cookie.setPath(req.getContextPath() + "/abc");// ---> /工程路径/abc
        resp.addCookie(cookie);

        resp.getWriter().write("创建了一个带有Path路径的cookie");

    }

Session

Session概述:

  1. Session是一个接口(HttpSession)。
  2. Session含义是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
  3. 每个客户端都有自己的一个Session 会话。
  4. Session会话中,我们经常用来保存用户登录之后的信息。

创建Session

  1. 创建和获取Session。都是使用request.getSession()方法
    该方法第一次调用是:创建Session对象
    在第一次创建会话的生命周期内调用该方法,都是获取前面已经创建好的Session对象。
  2. isNew(); 判断当前Session对象是不是刚创建出来的
    true 表示刚创建
    false 表示之前创建的
  3. 每个会话都有一个ID值,这个ID值是唯一的。
    getId() ;得到Session对象的ID值。
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建和获取Session会话对象
        HttpSession session = req.getSession();

        //判断当前Session会话是否是新创建出来的
        boolean aNew = session.isNew();

        //获取Session会话唯一标识id
        String id = session.getId();
        resp.getWriter().write("session会话ID是:"  + id + "<br>");
        resp.getWriter().write("session会话是否是新创建的:"  + aNew + "<br>");
    }

Session域

Session域JSP四大域对象之一。域对象是可以像Map 一样存取数据的对象。

 	//往Session域中保存数据
    protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getSession().setAttribute("key1","value1");
        resp.getWriter().write("在Session中存储数据成功");

    }
    
	//得到Session域中的数据
    protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object key1 = req.getSession().getAttribute("key1");
        resp.getWriter().write("从Session中获取出key1的数据是:" + key1);
    }

Session的生命周期

  1. setMaxInactiveInterval(int interval) 控制Session的生命周期(以秒为单位),超过指定的时长,Session就会被销毁。
    方法参数值为正数的时候,设置Session的生命周期。
    方法参数为零和负数表示永不超时(极少使用)
  2. getMaxInactiveInterval()获取Session 的超时时间
  3. invalidate() 让当前Session 会话马上超时无效。
 protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取了Session的默认超时时长
        int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
        resp.getWriter().write("Session的默认超时时长为:" + maxInactiveInterval + "秒");

    }

    protected void life3s(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先获取session对象
        HttpSession session = req.getSession();
        //设置当前Session3秒后超时
        session.setMaxInactiveInterval(3);
        resp.getWriter().write("当前session已设置为3秒后超时");

    }

    protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //先获取session对象
        HttpSession session = req.getSession();
        //设置当前Session马上超时
        session.invalidate();
        resp.getWriter().write("当前session已超时!");

    }

设置该Web工程下默认Session对象的生命周期
在web.xml文件中配置以下信息(如果不配置默认为30分钟)

  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>

Session的技术实现

Session技术,底层其实是基于Cookie技术来实现的。

服务器每次创建Session会话的时候,都会创建一个Cookie对象。
这个Cookie对象的key是: JSESSION,值是新创建出来的Session的ID值。

之后服务器通过响应头把该Cookie对象传给客户端,客户端每次请求也会把该Cookie发送给服务器。

然后服务器又会通过该Cookie的值,也就是之前创建Session对象的ID值查找Session对象,如果找不到Session对象,就重新创建,找到了就继续用之前的Session。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值