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保存在浏览器的缓存中
用户发送第二次请求的时候:会自动将浏览器缓存中的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实现原理:
- JSESSION=xxxxxx 这个是以Cookie的形式保存在浏览器的内存中的,浏览器只要关闭,这个cookie就没有了
- session列表是一个Map,map的key是session,map的value是session对象
- 用户第一次请求:服务器生成session对象,同时生成id,将id发给浏览器
- 用户第二次请求:自动将浏览器内存中的id发送给服务器,服务器根据id查找到cookie对象
- 关闭浏览器,内存消失,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(四)的更多相关文章
- ASP.NET 之深入浅出Session和Cookie
在做人事档案管理系统中,对于Session和Cookie的使用后理解更加深刻了,下面对本知识点总结学习. Session是什么? 简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有 ...
- Session or Cookie?是否有必要使用Tomcat等一下Web集装箱Session
Cookie是HTTP协议标准下的存储用户信息的工具.浏览器把用户信息存放到本地的文本文件里. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生).面试官也问过这个 ...
- c# Cookie,Session,Application,Cache 四种缓存使用情景
好记性不如烂笔头,记录一下C#缓存使用的情景模式....个人理解,不正之处,欢迎指正 讨论 Cookie,Session,Application,Cache 四种,有的缓存情景对人,有的缓存情景对事儿 ...
- {Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session
Django基础八之cookie和session 本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 ...
- Session or Cookie?是否需要用Tomcat等Web容器的Session
Cookie是HTTP协议标准下的存储用户信息的工具,浏览器把用户信息存放到本地的文本文件中. Session是基于Cookie实现的. 2011年4月,武汉群硕面试的时候(实习生),面试官也问过这个 ...
- Tomcat 中的 Session 和 Cookie
HTTP 是一种无状态通信协议,每个请求之间相互独立,服务器不能识别曾经来过的请求.而对于 Web 应用,它的活动都是依赖某个状态的,比如用户登录,此时使用 HTTP 就需要它在一次登录请求后,有为后 ...
- tomcat 设置session过期时间(四种方式)
1.在tomcat-->conf-->servler.xml文件中定义: <Context path="/test" docBase="/test&qu ...
- 【Tomcat】JSP使用Session、Cookie实现购物车
购物界面shop.jsp 初始页面 添加商品后,在session中设置属性,重定向回到shop.jsp,然后根据session的内容显示结果 Cookie设置setMaxAge可以延长session的 ...
- session和cookie详解2
http 之session和cookie http://www.cnblogs.com/ForEverKissing/archive/2008/05/23/1205503.html Session简介 ...
随机推荐
- 从0开始用webpack开发antd,react组件库npm包并发布
一.初始化一个npm包 1.新建一个文件夹(名称随意,建议和报名一致),输入命令 :npm init -y 会自动生成一个包的说明文件 package.json如下(本文以scroll-antd-ta ...
- 半导体行业如何保持高效远程办公?因果集群(Causal Clustering)了解一下!
什么是因果集群?因果集群是下一代多站点复制技术.它支持数据中心的分布式系统集群模型.借助于因果集群技术,可以让远程工作团队成员体验到更卓越的性能和更健壮的复制功能,确保您的团队始终以高效状态工作. 因 ...
- 聊聊如何在华为云IoT平台进行产品开发
摘要:华为云物联网平台承载着南北向数据互通的功能职责. 本文分享自华为云社区<如何基于华为云IoT物联网平台进行产品开发>,作者: Super.雯 . 华为云物联网平台承载着南北向数据互通 ...
- 基于.Net C# 通信开发-网络调试助手
基于.Net C# 通信开发-网络调试助手1.概述 网络调试助手是集TCP/UDP服务端客户端一体的网络调试工具,可以帮助网络应用设计.开发.测试人员检查所开发的网络应用软硬件的数据收发状况,提高开发 ...
- this-3
this是什么?JavaScript中,this关键词指的是他所属的对象:它拥有不同的值,具体取决于它的使用位置. 1.在单独情况下,this指向全局对象window:2.在函数中,this指向全局对 ...
- Java 17中对switch的模式匹配增强
还记得Java 16中的instanceof增强 吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); d ...
- Docker将镜像文件发布到私服库
上一篇已经介绍如何将镜像发布到阿里云:https://www.cnblogs.com/sportsky/p/16246394.html 一.创建新镜像文件 1.创建容器并在容器内创建文件 在根目录下创 ...
- REST APIs
REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"."/userDelete&quo ...
- 第一个Python程序 | 机选彩票号码+爬取最新开奖号码
(机选彩票号码+爬取最新开奖号码 | 2021-04-21) 学习记录,好记不如烂笔头 这个程序作用是<机选三种彩票类型的号码> 程序内包含功能有如下: 自动获取最新的三种彩票的开奖号码 ...
- ajax 请求登录超时跳转登录页解决方法
在Filter里判断是否登录,如果未登录返回401状态 public class SelfOnlyAttribute : ActionFilterAttribute { public override ...