什么是session串的问题

本文介绍了一个典型的Session串问题案例,并提供了两种解决方案:一是通过response.encodeURL方式包装所有连接;二是添加Filter来处理HTTP响应,确保SessionID的一致性。
 什么是session串的问题
典型案例:现有一Web系统,用用户A登录,打开修改页面Page1,然后通过菜单文件-》新窗口打开一个窗口,用用户B登录,然后回Page1页面提交,此时身份已经变为用户B,出现非希望的结果。这就是session串的问题。


如何解决Session串的问题
解决Session串的问题需要使用URL重写的技术,下面介绍一下什么是URL重写

什么是URL重写
    URL重写包括向URL路径添加一些容器可以解释的数据。规范要求会话ID必须编码在URL路径中,参数名称必须是jsessionid,例如: http://www.ss.com/catalog/index.html;jsessionid=1111,只有在你确定用户浏览器会把COOKIE停用的情况下才应使用URL重写,因为在这种情况下,WEB APP中的所有HYBERLINKS和FORM的ACTION  URL都要使用URL重写,这样就引入一个问题就是APP中所有的页面必须是动态的页面,不能存在静态的HTML页面了,因为每个页面在往服务器发送请求的时候都要在URL上带上JSESSIONID。所有页面都用SERVLET来处理的话速度就可能变慢了。
WebLogic默认打开URL重写功能,但是这是有个前提的,要求用HttpServletResponse.encodeURL()方法来包装url,如
out.println(" <a href=/"/myshop/catalog.jsp/">catalog </a>");
必需写成
out.println(" <a href=/""+response.encodeURL("myshop/catalog.jsp")+/">catalog </a>");
HttpServletResponse.encodeURL()方法检测客户端Cookie是否被禁用,如果禁用则会自动将session id加到URL中,如果没有禁用则不会添加。


具体解决方法
1.将现有系统的连接采用response.encodeURL的方式包装(工作量很大,包括href连接和js组装的连接)
2.添加一个Filter,包装HttpServletResponseWrapper,使得无论如何HttpServletResponse.encodeURL()方法都添加一个参数sid_token(值为session id)。如果是Form,则自动修改表单,添加一个隐藏字段sid_token(值为session id),同时在Filter的doFilter方法中添加一个逻辑,检查参数sid_token的值是否和当前的sesssion id一致,如果不一致则抛出异常,表示该用户已经退出系统。



注:1.Filter是否需要自动修改表单未经考证
        2.本来想采用标准的jsessionid,但是和CAS配合时发生问题。
<think>我们正在讨论session的概念及其在Web开发中的功能和用途。根据用户的问题,他想要了解什么是session以及它在Web开发中的作用。之前的对话历史中,用户询问了JSP的内置对象,其中包含了session对象,现在用户进一步深入询问session的概念。首先,我们需要明确session的定义:在Web开发中,session(会话)是一种服务器端的机制,用于在多个页面请求之间跟踪用户的状态信息。由于HTTP协议是无状态的,服务器无法自动识别连续的请求是否来自同一个用户,因此需要引入会话管理机制。session的功能和用途包括:1.用户身份验证:当用户登录后,服务器会创建一个session来存储用户的登录状态,这样在后续的请求中,服务器就知道该用户已经登录。2.数据存储:可以在session中存储用户相关的数据,例如购物车内容、用户偏好设置等。3.会话跟踪:通过session可以跟踪用户在一段时间内的活动,例如在多个页面之间保持用户的状态。session的工作原理通常是这样的:-当用户第一次访问服务器时,服务器会创建一个唯一的sessionID(通常是一个长的随机字符)。-服务器将这个sessionID发送给浏览器(通常通过Cookie,或者在URL重写中嵌入)。-浏览器在后续的请求中会携带这个sessionID(如果是通过Cookie,则浏览器会自动在请求头中带上;如果是URL重写,则需要在每个链接后附加sessionID)。-服务器通过收到的sessionID来找到对应的session对象,从而获取存储的信息。在JSP中,session对象是内置对象之一,可以直接使用。例如:session.setAttribute("user",userObject);//将用户对象存入sessionUseruser=(User)session.getAttribute("user");//从session中获取用户对象但是,session的使用也需要注意:-安全性:sessionID如果被窃取,可能导致会话劫持。因此,通常需要配合使用HTTPS来传输sessionID。-性能:session存储在服务器端(内存、数据库或文件系统中),当用户量很大时,会占用较多的服务器资源。因此,需要合理设计,避免在session中存储过多数据。-过期:服务器会设置session的过期时间(例如30分钟无活动则自动失效),以释放资源。另外,在分布式环境中,为了支持多个服务器实例,需要采用共享session的机制,例如将session存储在Redis等分布式缓存中,这样不同服务器都可以访问到同一个session。参考引用[1]中提到了Cookie和Session管理,其中Cookie通常用于在客户端存储sessionID,而session数据则存储在服务器端。因此,两者常常结合使用。现在,我们按照要求组织答案:1.使用中文回答。2.结构清晰,逐步解释。3.在适当的地方添加引用标识(引用[1])。4.生成相关问题。注意:用户要求生成相关问题,因此我们需要在最后提出几个相关问题。另外,用户提到“参考站内引用:引用[1]”,但我们目前只有这一个引用,所以我们在回答中可以引用这个引用。答案结构:1.先定义什么是session。2.解释为什么需要session(HTTP无状态)。3.详细说明session的功能和用途。4.简要说明session的工作原理(包括sessionID的传递)。5.在JSP中使用session的示例(因为之前用户问的是JSP内置对象,所以可以联系一下)。6.注意事项(安全性、性能等)。7.生成相关问题。由于用户的问题中没有数学公式,所以不需要使用LaTeX数学表达式。</think>### Session的概念及在Web开发中的功能与用途 #### 1. **Session基本定义** Session(会话)是服务器端用于**跨请求跟踪用户状态**的技术。当用户首次访问网站时,服务器会创建一个唯一的Session ID(通常通过Cookie传递),并在服务器内存/数据库中存储与该ID关联的数据结构[^1]。 **核心特性**: - 存储在服务器端(客户端仅保留Session ID) - 默认有效期约30分钟(可配置) - 每个用户拥有独立的Session空间 #### 2. **核心功能与用途** | 功能 | 用途说明 | 典型场景 | |------|-----------|----------| | **用户身份维护** | 存储登录凭证和权限信息 | 用户登录后保持认证状态<br>`session.setAttribute("isLogin", true)` | | **数据跨页传递** | 在多个页面间共享数据 | 购物车商品保存<br>`session.setAttribute("cart", itemList)` | | **用户行为跟踪** | 记录用户操作历史 | 浏览历史追踪/个性化推荐 | | **资源访问控制** | 管理用户专属资源 | 在线文档编辑的独占锁定 | | **安全验证** | 防御CSRF攻击 | 生成并验证会话Token | #### 3. **工作原理图解** ```mermaid sequenceDiagram participant Client as 浏览器 participant Server as 服务器 participant SessionDB as Session存储 Client->>Server: 首次请求 Server-->>SessionDB: 创建Session对象(ID=123) Server-->>Client: 返回响应(Set-Cookie:JSESSIONID=123) Client->>Server: 后续请求(Cookie:JSESSIONID=123) Server-->>SessionDB: 通过ID=123读取用户数据 Server-->>Client: 返回个性化内容 ``` #### 4. **JSP中的session对象** 在JSP页面可直接使用内置session对象: ```jsp <% // 存储用户信息 session.setAttribute("username", "张三"); // 读取会话数据 String role = (String)session.getAttribute("userRole"); // 设置超时时间(秒) session.setMaxInactiveInterval(1800); // 强制销毁会话 session.invalidate(); %> ``` #### 5. **Session vs Cookie** | 特性 | Session | Cookie | |------|---------|--------| | 存储位置 | 服务器端 | 客户端 | | 数据安全 | 高(仅ID暴露) | 低(数据可见) | | 存储限制 | 受服务器内存限制 | ≤4KB | | 生命周期 | 会话结束或超时 | 可长期保存 | > **最佳实践**: > - 敏感数据(如密码/权限)必须存Session > - 结合HTTPS传输Session ID防止窃取 > - 分布式系统需用Redis等集中存储Session[^1] ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值