session

 

如果WEB服务器处理某个访问请求时创建了新的HttpSession对象,它将把会话标识号作为一个Cookie项加入到响应消息中,通常情况下,浏览器在随后发出的访问请求中又将会话标识号以Cookie的形式回传给WEB服务器。

WEB服务器端程序依据回传的会话标识号就知道以前已经为该客户端创建了HttpSession对象,不必再为该客户端创建新的HttpSession对象,而是直接使用与该会话标识号匹配的HttpSession对象,通过这种方式就实现了对同一个客户端的会话状态的跟踪。

利用URL重写实现Session跟踪

Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。

将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写

如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。

利用Session防止表单重复提交à原理

包含有FORM表单的页面必须通过一个服务器程序动态产生,服务器程序为每次产生的页面中的FORM表单都分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。

当用户提交FORM表单时,负责接收这一请求的服务器程序比较FORM表单隐藏字段中的标识号与存储在当前用户的Session域中的标识号是否相同,如果相同则处理表单数据,处理完后清除当前用户的Session域中存储的标识号。在下列情况下,服务器程序将忽略提交的表单请求:

当前用户的Session中不存在表单标识号

用户提交的表单数据中没有标识号字段

存储在当前用户的Session域中的表单标识号与表单数据中的标识号不同

浏览器只有重新向WEB服务器请求包含FORM表单的页面时,服务器程序才又产生另外一个随机标识号,并将这个标识号保存在Session域中和作为新返回的FORM表单中的隐藏字段值。

程序包含三个Java源程序:TokenProcessor.java、FormGenerateServlet.java和FormDealServlet.java。

TokenProcessor.java是用于管理表单标识号的工具类,它主要用于产生、比较和清除存储在当前用户Session中的表单标识号。为了保证表单标识号的唯一性,每次将当前SessionID和系统时间的组合值按MD5算法计算的结果作为表单标识号,并且将TokenProcessor类设计为单件类。

FormGenerateServlet.java是用于产生FORM表单的Servlet程序,FormDealServlet是负责处理FORM表单请求的Servlet程序。

问题:

      同一个用户打开同一个浏览器进程的多个窗口来并发访问同一个WEB站点的多个FORM表单页面时,将会出现表单无法正常提交的情况。

解决方案:

将FORM表单的标识号作为表单隐藏字段的名称,如下所示:

      <input type='hidden' name='4b15c6b2f573831b4b5107d849fcafb8' value=''>

将所有的表单标识号存储进一个Vector集合对象中,并将Vector集合对象存储进Session域中。当表单提交时,先从Session域中取出Vector集合对象,然后再从Vector集合对象中逐一取出每个表单标识号作为参数调用HttpServletRequest.getParameter方法,如果其中有一次调用的返回值不为null,则接受并处理该表单数据,处理完后将该表单标识号从Vector集合对象中删除。

package com.csdn.session;

 

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.servlet.ServletContext;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class SessionDemo3 extends HttpServlet {

       public SessionDemo3() {

              super();

       }

       public void destroy() {

              super.destroy();                    }

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

 

              response.setContentType("text/html;charset=utf-8");

              PrintWriter out = response.getWriter();

              HttpSession session = request.getSession();

              Integer sessionCount = (Integer)session.getAttribute("count");

              int count = 0;

              if(sessionCount != null)

              {

                     count = sessionCount.intValue();

              }

              out.println("当前会话中发生了" + (++count) + "次访问<br>");

              session.setAttribute("count",new Integer(count));

             

              count = 0;

              ServletContext application = getServletContext();

              Integer applicationCount = (Integer)application.getAttribute("count");

              if(applicationCount != null)

              {

                     count = applicationCount.intValue();

              }

              out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");

              application.setAttribute("count",new Integer(count));

 

              out.println("<br/>");

              out.println("<a href='"+response.encodeURL("session4")+"'>Servlet2</a>");

             

             

              out.flush();

              out.close();

       }

 

       public void doPost(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

 

//                                        doGet(request,response);

       }

       public void init() throws ServletException {

                     }

 

}

### SESSION在编程中的含义 SESSION是一种用于存储用户会话信息的技术,在Web开发中广泛使用。它通过在服务器端保存用户的特定数据,使得用户在一个浏览器会话期间能够保持状态一致[^2]。默认情况下,PHP配置文件`php.ini`中定义了SESSION的保存方式为`files`(即`session.save_handler=files`),这意味着SESSION数据会被序列化并存储到文件系统中,具体路径由`session.save_path`参数决定[^1]。 #### 文件命名规则 SESSION文件通常以`sess_`作为前缀,后面跟随的是唯一的SESSION ID。例如,如果某个SESSION ID为`c72665af28a8b14c0fe11afe3b59b51b`,那么对应的文件名为`sess_c72665af28a8b14c0fe11afe3b59b51b`[^1]。 --- ### SESSION的工作原理 SESSION的核心思想是利用一种机制来跟踪用户的请求,并将这些请求关联起来形成一个完整的会话过程。以下是其工作流程: 1. **初始化SESSION** 当用户首次访问网站时,服务器会创建一个新的SESSION,并生成一个唯一标识符——SESSION ID。此ID被发送给客户端,一般通过Cookie的形式传递回服务器[^3]。 2. **数据存储** 用户的相关数据(如登录状态、购物车内容等)会被存储在服务器上的SESSION变量中。这些数据仅限于当前用户的会话范围,其他用户无法访问。 3. **恢复SESSION** 后续每次请求时,客户端都会携带之前分配的SESSION ID,服务器据此找到对应的数据记录并还原用户的会话环境[^3]。 --- ### PHP中SESSION的基本用法 以下是一个简单的例子,展示如何在PHP中启动和管理SESSION: ```php <?php // 初始化SESSION session_start(); // 设置SESSION变量 $_SESSION['username'] = 'JohnDoe'; // 获取SESSION变量 echo $_SESSION['username']; // 输出 JohnDoe // 删除SESSION变量 unset($_SESSION['username']); // 销毁整个SESSION session_destroy(); ?> ``` 在这个示例中: - `session_start()`函数用来开启或恢复现有的SESSION。 - 使用数组形式的`$_SESSION`超全局变量可以方便地存取数据。 - 调用`session_destroy()`可彻底销毁当前SESSION及其所有数据。 需要注意的是,默认情况下SESSION数据是以文件形式存储的,因此随着并发量增加可能会带来一定的性能开销。在这种场景下,考虑采用数据库或其他更高效的存储方案可能更为合适[^4]。 --- ### SESSION与其他技术的区别 为了更好地理解SESSION的作用,下面对比一下它与COOKIE以及TOKEN的主要差异: | 特性 | COOKIE | SESSION | TOKEN | |-----------------|----------------------------------|----------------------------------|-------------------------------| | 存储位置 | 客户端 | 服务端 | 客户端 | | 数据安全性 | 较低 | 高 | 取决于加密算法 | | 生命周期控制 | 支持自定义过期时间 | 基于SESSION ID的有效期限 | 依赖签发时间和刷新策略 | | 性能影响 | 对服务器无直接影响 | 占用较多内存资源 | 减轻服务器负担 | 从认证流程的角度来看,三种技术各有优劣,应根据实际需求灵活选用[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值