什么是Session以及Session产生的过程
什么是Session?
-
服务端会话技术
Session的产生过程:
-
浏览器访问 Web 服务器的资源时,服务器可以为每个用户浏览器创建一个 Session 对象
-
每个浏览器独占一个 Session 对象。
由于每个浏览器独占一个 Session,所以用户在访问服务器的资源时,可以把数据保存在各自的 Session 中。当用户再次访问该服务器中的其它资源时,其它资源可以从 Session 中取出数据,为用户服务。
Session工作原理
原理图:
过程分析:
-
客户端第一次请求会话对象时,服务端会创建一个Session对象,并分配一个SessionID给该对象
-
服务端将SessionID以Cookie的形式发送给客户端浏览器(Name:JESSIONID,value:SessionID)
-
浏览器再次发送请求的时候携带SessionID,服务端根据SessionID找到Session对象
注意:
-
流程中的 Cookie 是容器自动生成的,它的 maxAge 属性取值为 -1,表示仅当前浏览器有效。
-
浏览器关闭时,对应的 Session 并没有失效,与此 Session 对应的 Cookie 已失效,导致浏览器无法再通过 Cookie 获取服务器端的 Session 对象。
-
同一浏览器的不同窗口共享同一 Session 对象,不同浏览器窗口之间不能共享 Session 对象。--->导致一个账号不能多个浏览器登录的根本原因
SessionAPI
HttpServletRequest.getSession() 方法获得 HttpSession 对象:
//获取session对象
HttpSession session = request.getSession();
HttpSession接口当中对Session对象操作的方法:
返回值类型 | 方法 | 描述 |
---|---|---|
long | getCreationTime() | 返回创建 Session 的时间。 |
String | getId() | 返回获取 Seesion 的唯一的 ID。 |
long | getLastAccessedTime() | 返回客户端上一次发送与此 Session 关联的请求的时间。 |
int | getMaxInactiveInterval() | 返回在无任何操作的情况下,Session 失效的时间,以秒为单位。 |
ServletContext | getServletContext() | 返回 Session 所属的 ServletContext 对象。 |
void | invalidate() | 使 Session 失效。 |
void | setMaxInactiveInterval(int interval) |
指定在无任何操作的情况下,Session 失效的时间,以秒为单位。负数表示 Session 永远不会失效。--->Session 对象在服务器中驻留一段时间后没有被使用,就会被销毁,这个时间就是 Session 的过期时间。 |
Session与Cookie对比
不同点 | Cookie | Session |
---|---|---|
存储位置不同 | Cookie 将数据存放在客户端浏览器内存中或硬盘上。 | Session 将数据存储在服务器端。 |
大小和数量限制不同 | 浏览器对 Cookie 的大小和数量有限制。 | Session 的大小和数量一般不受限制。 |
存放数据类型不同 | Cookie 中保存的是字符串。 | Session 中保存的是对象。 |
安全性不同 | Cookie 明文传递,安全性低,他人可以分析存放在本地的 Cookie 并进行 Cookie 欺骗。 | Session 存在服务器端,安全性较高。 |
对服务器造成的压力不同 | Cookie 保存在客户端,不占用服务器资源。 | Session 保存在服务端,每一个用户独占一个 Session。若并发访问的用户十分多,就会占用大量服务端资源。 |
跨域支持上不同 | Cookie 支持跨域名访问。 | Session 不支持跨域名访问。 |
设置Session过期时间的方法
<session-config>
元素
setMaxInactiveInterval()
方法
<session-config>
元素
在web.xml当中进行配置:
-
<session-timeout>
元素用来指定默认 Session 过期时间,以分钟为单位,该元素值必须为整数。 -
<session-timeout>
元素的值为零或负数,表示 Session 永远不会过期。
调用setMaxInactiveInterval()
方法
//设置会话的过期时间
request.getSession().setMaxInactiveInterval(100);
示例代码:
获取SessionID:
package com.example.HttpServletRequestDemo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 记录上次访问的时间--->服务端生成Session
* @since JDK 1.8
* @date 2021/09/20
* @author Lucifer
*/