Tomcat深入浅出——Session与Cookie(四)

一、Cookie

1.1 Cookie概念

**Cookie:**有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息

1.2 为什么要使用Cookie

**Cookie原理:**当客户端去访问使用了cookie的服务器时,服务器会生成一份cookie发送到客户端,客户端会把这个数据保存起来,然后这样下次使用时,服务器就可以通过cookie知道是哪个客户端了。

  • 首先我们要了解HTTP是无状态的,所以我们需要使用cookie和session机制。Cookie翻译为曲奇小饼干,所以它非常的小,不超过4k。
  • 当我们在多个页面都需要同一个数据时,我们的web程序无法将信息记录下来,所以导致了我们每次都需要从服务器重新的去请求数据,这就导致了我们重复的干一个工作,所以就引出了cookie这个概念。

  • 可以了解到cookie只支持字符串形式

1.3 Cookie常用方法

  • cookie.setMaxAge(0);此方法用来设置cookie时间

    • 当值等于0时,意味着删除cookie
    • 当值大于0时,意味着cookie的存活时间,会将浏览器数据存在本地的硬盘中。
    • 当值小于0时,表示存储在浏览器的内存中,并不存储到硬盘中,和没调用一样🤮
  • cookie1.setPath(req.getContextPath());设置访问路径

    -浏览器访问这个路径,一定要带cookie才行

  • Cookie cookie1 = new Cookie("username",username);设置cookie对象存储账号

1.4 Cookie实现的应用

  • 我们可以通过设置cookie,将用户的账号密码存储在本地硬盘中,来设置10天内免登录。但是cookie并不安全
  • 京东在未登录的情况下,向购物车添加商品,然后关闭浏览器,再次打开浏览器时候,购物车的东西还在,将购物车的商品编号放到cookie当中,而cookie保存在硬盘文件当中。
  • 像我们浏览器中的记住密码、或者访问B站大学登陆一次以后下次就不用登录了,这些都是利用了cookie机制

二、Session

2.1 Session原理

  • 在web服务器中有一个session列表。类似于map集合。这个map集合的key存储的是session ID。

  • 这个map集合的value存储的是对应的session对象

  • **用户发送第一次请求的时候:**服务器会创建一个新的session对象,同时给session对象生成一个id,然后web服务器会将session的id发送给浏览器,浏览器将session的id保存在浏览器的cookie中

  • **用户发送第二次请求的时候:**会自动将浏览器cookie中的sessionID 自动发送给服务器,服务器获取到session ID,然后从session列表中查找到对应的session对象

  • 因为session是存放于服务器中的,这也是它和cookie的区别。

  • JSESSION=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的,浏览器只要关闭,这个cookie就没有了

2.2你以为session真的销毁了吗?

1.为什么我们每次关闭了浏览器,会话就结束了?

  • 关闭浏览器之后,浏览器中保存的sessionID消失,下次重新打开浏览器之后,浏览器缓存中没有这个sessionID,自然找不到服务器中对应的session对象,session对象找不到等同于会话结束!!!
  • 但是我们可以不关闭浏览器,而是直接关闭服务器,这样你会发现虽然他们都用同样的sessionId,但是仍然找不到服务器中对应的session对象,这就要了解一下session的钝化活化了。

2.session销毁的方式

  • 手动销毁,将调用这个方法session.invalidate()
  • 自动销毁,session在我们的配置文件中其实默认是30分钟,时间一到他就会自动销毁。
  • 我们可以通过session.setMaxInactiveInterval()设置超时时间

3.session实现原理:

  1. JSESSION=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的,浏览器只要关闭,这个cookie就没有了
  2. session列表是一个Map,map的key是session,map的value是session对象
  3. 用户第一次请求:服务器生成session对象,同时生成id,将id发给浏览器
  4. 用户第二次请求:自动将浏览器内存中的id发送给服务器,服务器根据id查找到cookie对象
  5. 关闭浏览器,内存消失,cookie消失,会话等同于结束!

2.3 session常用方法与应用场景

  • HttpSession session = req.getSession();获取session,session是存在于一次会话中,我们可以将经常用的小信息,放入里面,例如登录的User信息,我们可以通过session,在每个页面都能拿到数据,而不必对服务器进行多次的请求。
  • session.setAttribute("user",person);设置session域。
  • request请求域(HttpServletRequest)、session会话域(HttpSession)、application域(ServletContext)域的大小关系为:request < session < application
//设置session销毁时间
<session-config>
    <session-timeout>30</session-timeout>
</session-config>
  • 我们可以通过session进行判断用户是否登录,如果已经注销了登录,则通过判断session是否存在,控制用户是否能够访问某些界面。

三、Session的钝化和活化

      我们知道session是将信息存储到服务器里的,但是为什么我们每次关闭浏览器再打开,却拿不到存在浏览器里的数据呢,这就需要我们了解一下如何钝化活化

**钝化:**当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的这个目录下,这个过程叫做Session 的钝化。

**活化:**当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。

  • 实现session钝化和活化,它的pojo类必须实现Serializable接口,同时也可以实现一个HttpSessionActivationListener监听Session行为的接口。
public class Person implements Serializable, HttpSessionActivationListener {
    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;
    
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
      
        System.out.println("会话将被钝化,数据保存到硬盘");
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("会话被活化,数据从硬盘中取出来了");
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 我们分别设置两个Servlet类,一个用来放session信息,一个用来取session信息
//用来存储session信息
@WebServlet("/sessionTest")
public class SessionTest extends HttpServlet{
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Person person = new Person();
        person.setName("lx");
        person.setAge(20);
        session.setAttribute("user",person);
    }
}
//用来拿到session信息
@WebServlet("/sessionTest01")
public class SessionTest01 extends HttpServlet{
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        Person user =(Person) session.getAttribute("user");
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }
}

最后一步,配置文件:

  • 在我们的Tomcat目录下的conf中的context.xml添加如下信息

  • 下面让我们来测试一下

四、cookie和session区别

五、结尾

  • 对于Tomcat的Servlet内容就总结这么多,若想深入学习等待后续更新。
  • 我将会继续更新关于Java方向的学习知识,感兴趣的小伙伴可以关注一下。
  • 文章写得比较走心,用了很长时间,绝对不是copy过来的!
  • 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
  • 😎你的点赞与关注,是我努力前行的无限动力。🤩
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值