Session详解

43 篇文章 0 订阅

Session详解

一、概念

Session是服务器端的一种机制,通过它可以存储用户的数据。每当一个新的客户端访问服务器时,服务器会为其创建一个Session对象,存储特定于该客户端的信息。这个Session在用户访问期间是持续的。

二、应用场景

  1. 用户登录状态:保存用户的登录信息,避免用户在每个页面都要重新登录。
  2. 购物车:保存用户在电商网站上选择的商品,直到用户完成购买。
  3. 个性化设置:保存用户的偏好设置,如语言、主题等。

理解:在Web开发中,Session(会话)是用来存储特定用户会话数据的机制,通常用于保存用户的登录状态、购物车内容等信息。

三、底层实现原理

  1. Session ID的生成与分配

当用户第一次访问服务器时,服务器会为其创建一个新的Session对象,并生成一个唯一的Session ID。这个ID通常是一个随机且唯一的字符串,用于标识客户端的会话。

  1. 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");
        }
    }
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值