一、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保存在浏览器的缓存中

  • 用户发送第二次请求的时候:会自动将浏览器缓存中的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过来的!
  • 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
  • 你的点赞与关注,是我努力前行的无限动力。

Tomcat深入浅出——Session与Cookie(四)的更多相关文章

  1. ASP.NET 之深入浅出Session和Cookie

    在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...

  2. Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session

    Cookie是HTTP协议标准下的存储用户信息的工具.浏览器把用户信息存放到本地的文本文件里. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生).面试官也问过这个 ...

  3. c# Cookie,Session,Application,Cache 四种缓存使用情景

    好记性不如烂笔头,记录一下C#缓存使用的情景模式....个人理解,不正之处,欢迎指正 讨论 Cookie,Session,Application,Cache 四种,有的缓存情景对人,有的缓存情景对事儿 ...

  4. {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

    Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...

  5. Session or Cookie?是否需要用Tomcat等Web容器的Session

    Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...

  6. Tomcat 中的 Session 和 Cookie

    HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求.而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后 ...

  7. tomcat 设置session过期时间(四种方式)

    1.在tomcat-->conf-->servler.xml文件中定义: <Context path="/test" docBase="/test&qu ...

  8. 【Tomcat】JSP使用Session、Cookie实现购物车

    购物界面shop.jsp 初始页面 添加商品后,在session中设置属性,重定向回到shop.jsp,然后根据session的内容显示结果 Cookie设置setMaxAge可以延长session的 ...

  9. session和cookie详解2

    http 之session和cookie http://www.cnblogs.com/ForEverKissing/archive/2008/05/23/1205503.html Session简介 ...

随机推荐

  1. go-micro使用Consul做服务发现的方法和原理

    go-micro v4默认使用mdns做服务发现.不过也支持采用其它的服务发现中间件,因为多年来一直使用Consul做服务发现,为了方便和其它服务集成,所以还是选择了Consul.这篇文章将介绍go- ...

  2. XCTF练习题---MISC---stegano

    XCTF练习题---MISC---stegano flag:flag{1nv151bl3m3554g3} 解题步骤: 1.观察题目,下载附件 2.打开发现是一张PDF图片,尝试转换word无果后,想到 ...

  3. Java 15 新特性:文本块

    大家好,我是DD,今天继续来学点Java的新特性! 假设有这样一个场景,我们需要做一个工具.用来自动生成项目文档,文档可以通过浏览器查看,所以最后产出物肯定是一堆html文件.为了让这些html文件更 ...

  4. Linux启动故障排查和修复技巧

    一个执着于技术的公众号 我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应对单用户模式.GRUB命令操作.Linux救援模式的故障修复案例帮助大家了解此类问题的解 ...

  5. 超清晰的 DNS 原理入门指南,看这一篇就够了~

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! DNS 是互联网核心协议之一.不管是上网浏览,还是编程开 ...

  6. 流量录制回放工具jvm-sandbox-repeater入门篇——服务部署

    趋于当前技术不断更新.产品功能多元化之下,流量回放的热度也是越来越高. 在前一段时间,测试团队也提到阿里开源的流量回放工具 jvm-sandbox-repeater 我个人就先尝试一下,期间还是遇到一 ...

  7. mmsegmentation中构造自己的数据集和数据加载部分,跑现有demo

    在mmsegmentation中训练自己的数据集 先在mmse/dataset下创建一个python文件,我的名字是my_thermal_dataset.py 在其中填写下面内容 这里要注意,在设置s ...

  8. Rainbond结合NeuVector实践容器安全管理

    前言 Rainbond 是一个云原生应用管理平台,使用简单,不需要懂容器.Kubernetes和底层复杂技术,支持管理多个Kubernetes集群,和管理企业应用全生命周期.但是随着云原生时代的一点点 ...

  9. 详解TCP三次握手(建立TCP连接过程)

    在讲述TCP三次握手,即建立TCP连接的过程之前,需要先介绍一下TCP协议的包结构. 这里只对涉及到三次握手过程的字段做解释 (1) 序号(Sequence number) 我们通过 TCP 协议将数 ...

  10. SyntaxError: Non-UTF-8 code starting with '\xef' in file(已解决)

    错误原因: python代码中出现了中文字符 解决方案: 在python代码文件的第一行(必须是第一行)添加如下代码(随编码不同自行修改): #coding=utf-8