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实现原理:
- 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过来的!
- 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
- 😎你的点赞与关注,是我努力前行的无限动力。🤩