JavaWeb-Cookie,Session


前言

javaweb有四个域对象,都可以传入值当作存储数据,分别为:

  • PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
  • ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
  • HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
  • ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用
    不支持中文,像Map一样,存储于客户端页面的内容

Cookie的创建

创建cookie对象
Cookie cookie = new Cookie(“key1”,“value1”);
通知客户端保存
resp.addCookie(cookie);
可以一次创建多个,都要加入response才能返回给客户端
在这里插入图片描述

Cookie的获取

Cookie[] cookies = req.getCookies();

Cookie的工具类

public class CookieUtils {
    //cookie的工具类,寻找指定的cookie
    
    public static Cookie findCookie(String name,Cookie[] cookies){
        if(name==null || cookies == null || cookies.length==0) {
            return null;
        }

        for (Cookie cookie : cookies) {
            if(name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}

修改Cookie值

方案一:
1先创建一个要修改的同名的cookie对象
2在构造器中,同时赋予新的Cookie值
3调用rep.addCookie();

Cookie cookie2 = new Cookie("key2","value21");
//通知客户端保存
resp.addCookie(cookie2);
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("Cookie修改成功");

方案二:
1先查找到需要修改的Cookie对象
2调用setValue()方法赋予新的Cookie值
3调用rep.addCookie();

Cookie cookie3 = CookieUtils.findCookie("key2",req.getCookies());
if (cookie3!=null){
    cookie3.setValue("newValue2");
    resp.addCookie(cookie3);
}

浏览器查看Cookie

在这里插入图片描述

Cookie的生命控制

Cookie的声明控制是指如何管理Cookie什么时候被销毁
setMaxAge()
设置cookie的最大生存时间 秒数单位

  • 正数 表示在指定秒数后销毁
  • 负数 表示退出浏览器,则销毁(默认是负数)
  • 零 表示马上删除cookie

Cookie cookie = new Cookie(“life3600”,“life3600”);
cookie.setMaxAge(3600); //设置存活时间
resp.addCookie(cookie);

Cookie有效路径Path的设置

过滤哪些cookie可以发送给服务器,哪些不发
Path属性是通过请求的地址来进行有效的过滤
满足路径的的浏览器页面才能找到的cookie

Cookie cookie = new Cookie(“path1”,“path1”);
cookie.setPath(req.getContextPath()+"/abc"); //设置路径
resp.addCookie(cookie);

练习:Cookie免用户名登录

贴出servlet内的操作

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    String username  = req.getParameter("username");
    String password = req.getParameter("password");

    if("yuan".equals(username)&&("123").equals(password)){
        //登录成功
        Cookie cookie = new Cookie("username",username);
        cookie.setMaxAge(60*60*24*7);   //当前cookie一星期内有效
        resp.addCookie(cookie);
        System.out.println("登陆成功");
    }else{
        System.out.println("登陆失败");
    }
}

在这里插入图片描述

Session会话

Cookie是保存在客户端中,而session是保存在服务端

Session创建和获取

Request.getSession()
第一次调用是创建session会话
之后都是获取前面创建好的session对象

IsNew() 判断到底是不是刚创建出来的(新的)

每个会话都有一个身份号码,也就是ID值,而且是唯一的
getId() 得到session的会话id值

protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    HttpSession session = req.getSession();  //创建和获取session会话

    boolean isNew = session.isNew();   //判断是否是新创建出来的

    String id = session.getId();
    resp.setCharacterEncoding("UTF-8");
    resp.getWriter().write("得到的session的id值是:"+id+"<br/>");
    resp.getWriter().write("得到的session是否是新创建的:"+isNew+"<br/>");
}

数据的存取

protected void set(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.getSession().setAttribute("key1","value1");
    resp.setCharacterEncoding("UTF-8");
    resp.getWriter().write("已经保存了数据");
}
protected void get(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    Object key = req.getSession().getAttribute("key1");
    resp.setCharacterEncoding("UTF-8");
    resp.getWriter().write("获取的数据是:"+key);
}

生命周期的控制

SetMaxInactiveInteval(int interval)
设置session的超时时间,超过指定的时长,session就会被销毁

  • 值为正数时,设定session的超时时长
  • 如果值为负数,表示永不超时(极少使用)

GetMaxInactiveInteval(int interval)
获取时长

Invalidate()
让session会话马上销毁
以秒为单位

Session的默认超时时长是:1800秒 = 30分钟
Tomcat的xml文件中设置的,可以修改,最好不要

统一修改session方法如下;

<!--表示当前web工程创建出来的session默认是20分钟超时时长-->
<session-config>
    <session-timeout>20</session-timeout>
</session-config>

超时概念*

浏览器与session之间的内幕
问题:
上面说session内的域对象可以设置超时时长来设置什么时候销毁对象,可是session域的说明是关闭服务器的连接则销毁域对象,这两句话有点冲突,到底session内的对象是如何销毁的。

Session技术,底层是基于Cookie技术实现的
Session之所以只有一个对象,是因为第一次客户端请求session对象的时候,服务器会把session的id保存在cookievalue值中,key永远是JSESSIONID
然后返回给客户端,这样客户端以后每次请求,都会把cookie的内容发送给服务器,服务器就不用再创建新的session对象,而且id是一样的,所以是同一个对象

如果删掉cookie,则会建立新的session对象,不论session对象超时与否

问题回答:
如果session设置24小时,可是我们关闭浏览器,session也会销毁的原因是session的cookie在浏览器关闭的时候被销毁了,说明记录的session对象id值不存在了,就找不到在内存中之前的session域内的东西,需要重新创建一个session对象。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值