Session跟踪

Session跟踪
Web容器使用了一些方法使用户和特定的session相关联,这些方法在客户端与服务器端之间传递session的标识。这个标识可以作为cookies在客户端被维护,或者Web组件把这个标识包含在每个URL中返回到客户端。
如果应用需要使用session对象,那么开发人员必须确保在用户关闭cookies的情况下,应用能够改写URL使session跟踪功能激活。在所有返回给用户URL之前都调用response的encodeURL(URL)方法,这样在用户关闭cookies的情况下URL中就会包含session ID,否则不改变URL。 例如:
   out.println("<p> &nbsp; <p><strong><a href=/"" +
   
   response.encodeURL(request.getContextPath() + "/catalog") +
      "/">" + messages.getString("ContinueShopping") +
      "</a> &nbsp; &nbsp; &nbsp;" +
      "<a href=/"" +
   
   response.encodeURL(request.getContextPath() + "/cashier") +
      "/">" + messages.getString("Checkout") +
      "</a> &nbsp; &nbsp; &nbsp;" +
      "<a href=/"" + 
   
   response.encodeURL(request.getContextPath() +
      "/showcart?Clear=clear") +
      "/">" + messages.getString("ClearCart") +
      "</a></strong>");
上面的代码改写了三个URL,如果客户端关闭 cookies,则URL被改写为:
http://localhost:6888/bookstore1/cashier; jsessionid=wKgUUxroPN$HVmpTkhU6YPLTqyMA
如果客户端cookies未关闭,则URL不作任何改变:
http://localhost:6888/bookstore1/cashier
### Session 跟踪技术的工作原理 #### 创建过程 当用户首次访问网站时,服务器会创建一个新的 session 对象并分配唯一的 sessionId 给该对象。这个唯一标识符通常是一个随机字符串[^2]。 #### 存储方式 sessionId 需要被传递给客户端以便后续请求能够关联同一个 session。这通常是通过 Cookie 来实现的;浏览器会在每次向同一域名发送 HTTP 请求时自动附带此 Cookie。如果出于安全考虑禁用了 Cookies,则可以采用 URL 参数或表单隐藏字段的方式携带 sessionId[^4]。 #### 数据保存位置 与 Cookie 不同的是,实际的 session 数据并不存放在用户的设备上而是保留在服务器端。这些数据可能存在于内存中、文件系统里或者是更持久化存储如数据库甚至是分布式缓存系统(比如 Redis 或 Memcached)。这样做的好处是可以减少客户端负担同时也提高了安全性[^5]。 #### 生命周期管理 为了防止资源浪费以及保护隐私,sessions 应具有合理的有效期设置。一旦超过了设定的时间间隔未收到来自相同 client 的新活动信号,server 就应该终止相应的 session 并清除相关联的数据。此外,在某些情况下也可以由应用程序逻辑显式结束某个 session,例如用户主动登出操作之后。 ```python import uuid from datetime import timedelta, datetime class SimpleSessionManager: def __init__(self): self.sessions = {} def create_session(self, user_data=None): session_id = str(uuid.uuid4()) expiration_time = datetime.now() + timedelta(hours=1) new_session = { 'id': session_id, 'data': user_data or {}, 'expires_at': expiration_time } self.sessions[session_id] = new_session return session_id def get_session(self, session_id): now = datetime.now() if session_id not in self.sessions or \ self.sessions[session_id]['expires_at'] < now: del self.sessions[session_id] raise Exception('Invalid or expired session') return self.sessions[session_id] manager = SimpleSessionManager() sid = manager.create_session({'username': 'test_user'}) print(manager.get_session(sid)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值