Session详解
一、概念
Session是服务器端的一种机制,通过它可以存储用户的数据。每当一个新的客户端访问服务器时,服务器会为其创建一个Session对象,存储特定于该客户端的信息。这个Session在用户访问期间是持续的。
二、应用场景
- 用户登录状态:保存用户的登录信息,避免用户在每个页面都要重新登录。
- 购物车:保存用户在电商网站上选择的商品,直到用户完成购买。
- 个性化设置:保存用户的偏好设置,如语言、主题等。
理解:在Web开发中,Session(会话)是用来存储特定用户会话数据的机制,通常用于保存用户的登录状态、购物车内容等信息。
三、底层实现原理
- Session ID的生成与分配
当用户第一次访问服务器时,服务器会为其创建一个新的Session对象,并生成一个唯一的Session ID。这个ID通常是一个随机且唯一的字符串,用于标识客户端的会话。
- Session ID的存储与传递
Session ID需要在客户端和服务器之间传递,以便在后续请求中识别客户端的Session。常见的传递方式包括:
- Cookie:这是最常用的方法,服务器将Session ID存储在客户端的Cookie中。每次客户端发送请求时,都会自动携带这个Cookie。
- URL重写:在不支持Cookie的情况下,Session ID可以附加在URL中,如
http://example.com/page;jsessionid=abcd1234
。这种方法较少使用,主要用于支持禁用Cookie的场景。 - 隐藏字段:在表单中使用隐藏字段传递Session ID,但这种方法较不常见且不安全。
3**. Session数据存储**
Session的数据通常存储在服务器的内存中,但也可以存储在其他地方,如数据库、文件系统或分布式缓存中。每个Session对象是一个数据结构,可以保存与用户相关的各种信息。
3.1 内存存储
这是最简单和最快的方法,但也有内存占用的问题,特别是在有大量活跃用户时。
3.2 数据库存储
用于持久化Session数据,适用于需要Session数据持久性或多台服务器共享Session的情况。数据库存储增加了存取的开销,但解决了单点故障的问题。
3.3 分布式缓存
如Redis、Memcached等,适用于分布式系统中,能够在多个服务器节点之间共享Session数据,同时提供快速的读写操作。
四、生命周期
Session有生命周期,包括创建、使用、超时和销毁。
- 创建:当用户首次访问时创建。
- 使用:每次请求会更新Session的活动时间。
- 超时:在设定的时间内没有访问,Session会自动失效。这是为了防止长期不活跃的Session占用服务器资源。
- 销毁:用户主动注销或Session超时,服务器会销毁Session对象。
五、存储形式
session类似于一个Map,里面可以存放多个键值对,是以key-value进行存放的。key必须是一个字符串,value是一个对象。
六、常用方法
1、resquest.getSession():得到请求游览器(客户端)对应的session。如果没有,那么就创建应该新的session。如果有那么就返回对应的session
2、setAttribute(String s, Object o):在session存放属性
3、getAttribute(String s):从session中得到s所对应的属性
4、removeAttribute(String s):从session中删除s对应的属性
5、getId():得到session所对应的id
6、invalidate():使session立即无效
7、setMaxInactiveInterval(int i):设置session最大的有效时间。注意,这个有效时间是两次访问服务器所间隔的最大时间,如果超过最大的有效时间,那么这个session就失效了。
七、示例
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "password".equals(password)) {
HttpSession session = request.getSession();
session.setAttribute("username", username);
response.sendRedirect("welcome.jsp");
} else {
response.sendRedirect("login.jsp");
}
}
}
@WebServlet("/welcome")
public class WelcomeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false);
if (session != null && session.getAttribute("username") != null) {
request.getRequestDispatcher("welcome.jsp").forward(request, response);
} else {
response.sendRedirect("login.jsp");
}
}
}