一、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. 从0开始用webpack开发antd,react组件库npm包并发布

    一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...

  2. 半导体行业如何保持高效远程办公?因果集群(Causal Clustering)了解一下!

    什么是因果集群?因果集群是下一代多站点复制技术.它支持数据中心的分布式系统集群模型.借助于因果集群技术,可以让远程工作团队成员体验到更卓越的性能和更健壮的复制功能,确保您的团队始终以高效状态工作. 因 ...

  3. 聊聊如何在华为云IoT平台进行产品开发

    摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...

  4. 基于.Net C# 通信开发-网络调试助手

    基于.Net C# 通信开发-网络调试助手1.概述 网络调试助手是集TCP/UDP服务端客户端一体的网络调试工具,可以帮助网络应用设计.开发.测试人员检查所开发的网络应用软硬件的数据收发状况,提高开发 ...

  5. this-3

    this是什么?JavaScript中,this关键词指的是他所属的对象:它拥有不同的值,具体取决于它的使用位置. 1.在单独情况下,this指向全局对象window:2.在函数中,this指向全局对 ...

  6. Java 17中对switch的模式匹配增强

    还记得Java 16中的instanceof增强 吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); d ...

  7. Docker将镜像文件发布到私服库

    上一篇已经介绍如何将镜像发布到阿里云:https://www.cnblogs.com/sportsky/p/16246394.html 一.创建新镜像文件 1.创建容器并在容器内创建文件 在根目录下创 ...

  8. REST APIs

    REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"."/userDelete&quo ...

  9. 第一个Python程序 | 机选彩票号码+爬取最新开奖号码

    (机选彩票号码+爬取最新开奖号码 | 2021-04-21) 学习记录,好记不如烂笔头 这个程序作用是<机选三种彩票类型的号码> 程序内包含功能有如下: 自动获取最新的三种彩票的开奖号码 ...

  10. ajax 请求登录超时跳转登录页解决方法

    在Filter里判断是否登录,如果未登录返回401状态 public class SelfOnlyAttribute : ActionFilterAttribute { public override ...