Java中的Session

本文介绍了如何使用Java Servlet中的HttpSession接口来管理HTTP会话状态。详细解释了Session的创建、使用和销毁过程,并通过一个示例程序展示了如何在实际应用中操作Session变量。

        会话状态的维持是开发Web应用所必须面对的问题,有多种方法可以来解决这个问题,如使用Cookies,hidden类型的表单域,或直接把状态信息加 到URL中等,还有Servlet本身提供了一个HttpSession接口来支持会话状态的维持,在这里我们主要介绍基于这个接口的会话状态的管理。

  Session的发明是为了填补HTTP协议的局限。请注意HTTP协议是如何工作的--用户发出请求,服务器作出响应,这种用户端和服务器端 的联系就是离散的,非连续的。HTTP协议不能提供允许服务器跟踪用户请求的功能。在服务器端完成响应用户的请求之后,服务器不能继续与该浏览器继续保持 连接。从服务器这端来看,每一个请求都是独立的,因此HTTP协议被认为是无状态协议,当用户在多个主页间切换时,服务器无法知道他的身份。 Session的出现就是为了弥补这个局限。利用Session,您就可以当一个用户在多个主页间切换的时候也能保存他的信息。这样很多以前根本无法去做 的事情就变得简单多了。

  在访问者从到达某个特定的主页到离开为止的那段时间,每个访问者都会单独获得一个Session。

  Java Servlet定义了一个HttpSession接口,实现的Session的功能,在Servlet中使用Session的过程如下:

  (1) 使用HttpServletRequest的getSession方法得到当前存在的session,如果当前没有定义session,则创建一个新的session,还可以使用方法getSession(true)

  (2) 写session变量。可以使用方法HttpSession.setAttribute(name,value)来向Session中存储一个信息。也可以使用HttpSession.putValue(name,value),但这个方法已经过时了。

   (3)读Session变量。可以使用方法HttpSession.getAttribute(name)来读取Session中的一个变量值,如果 name是一个没有定义的变量,那么返回的是null。需要注意的是,从getAttribute读出的变量类型是Object,必须使用强制类型转换, 比如:

  String uid = (String) session.getAttribute("uid");

  也可以使用HttpSession.getValue(name),但是这个方法也已经过时了。

  (4) 关闭session,当时用完session后,可以使用session.invalidate()方法关闭session。但是这并不是严格要求的。因为,Servlet引擎在一段时间之后,自动关闭seesion。

  下面举一个简单的例子说明session的使用

  //97色色 SessionExample.java

  import java.io.*;

  import java.util.*;

  import javax.servlet.*;

  import javax.servlet.http.*;

  //导入必要的软件包

  public class SessionExample extends HttpServlet

  {

  public void doGet(HttpServletRequest request, HttpServletResponse response)

  throws IOException, ServletException //实现doGet方法

  {

  response.setContentType("text/html"); //设置HTTP头

  PrintWriter out = response.getWriter(); //得到输出97gan

  HttpSession session = request.getSession(true);

  //得到session对象

  //打印HTML标记

  out.println("<html>");

  out.println("<head>");

  out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=gb2312\">");

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

  out.println("<body>");

  Date created = new Date(session.getCreationTime());

  //得到session对象创建的时间

  Date accessed = new Date(session.getLastAccessedTime());

  //得到最后访问该session对象的时间

  out.println("ID " + session.getId()+"<br>");

  //得到该session的id,并打印

  out.println("Created: " + created+"<br>");

  //打印session创建时间

  out.println("Last Accessed: " + accessed+"<br>");

  //打印最后访问时间

  session.setAttribute("UID","12345678");

  //在session中添加变量UID=12345678

  session.setAttribute("Name","Tom");

  //在session中添加变量Name=Tom

  Enumeration e = session.getAttributeNames();

  //得到session中变量名的枚举对象

  while (e.hasMoreElements()) { //遍历每一个变量

  String name = (String)e.nextElement(); //首先得到名字

  String value = session.getAttribute(name).toString();

  //由名字从97gan中得到值

  out.println(name + " = " + value+"<br>"); //打印

  }

  out.println("</body>"); //打印HTML标记

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

  }

  }

  }

### JavaSession的基本概念和用法 #### 1. Session的基本概念 Session 是一种用于在服务器端存储用户会话数据的技术。每个用户与服务器交互时,都会生成一个唯一的 Session ID,客户端通过这个 ID 来标识自己的会话。Session 数据存储在服务器端,因此客户端无法直接访问这些数据,这使得它适合存储敏感信息,例如用户的登录状态或购物车内容[^2]。 当用户首次访问服务器时,服务器会创建一个新的 Session,并为该用户分配一个唯一的 Session ID。此 ID 通常通过 Cookie 或 URL 重写的方式传递给客户端。如果一定时间内客户端没有与服务器进行交互,Session 将因超时而失效,其默认超时时间在 Tomcat 中为 120 分钟,但可以通过 `HttpSession` 的 `setMaxInactiveInterval` 方法调整[^3]。 #### 2. Session的生命周期 Session 的生命周期从用户第一次访问服务器开始,到以下任一条件满足时结束: - 用户明确调用了 `invalidate()` 方法销毁 Session。 - 超过了设置的最大非活动间隔(默认为 120 分钟)。 - 服务器重启(某些情况下,Session 数据可能会被持久化并恢复,但这取决于具体实现)[^4]。 需要注意的是,浏览器关闭并不会自动通知服务器结束会话,因此服务器通常依赖于超时机制来清理不再活跃的 Session[^3]。 #### 3. Session的基本使用方法 以下是使用 JavaSession 的基本步骤: - **获取 Session 对象**:通过 `HttpServletRequest` 的 `getSession()` 方法获取当前请求对应的 Session。如果当前请求没有关联的 Session,则会创建一个新的 Session。 - **存储数据**:使用 `setAttribute(String name, Object value)` 方法将数据存储到 Session 中。 - **获取数据**:使用 `getAttribute(String name)` 方法从 Session 中检索数据。 - **销毁 Session**:调用 `invalidate()` 方法销毁当前 Session。 以下是一个简单的代码示例,展示了如何使用 Session 存储和检索数据: ```java // 获取 Session 对象 HttpSession session = request.getSession(); // 存储数据到 Session session.setAttribute("username", "JohnDoe"); // 从 Session 中获取数据 String username = (String) session.getAttribute("username"); // 设置 Session 的最大非活动间隔(单位:秒) session.setMaxInactiveInterval(60 * 30); // 30 分钟 // 销毁 Session session.invalidate(); ``` #### 4. Session与Cookie的区别 虽然 Session 和 Cookie 都可以用于维护用户会话状态,但它们有显著的区别: - **存储位置**:Session 数据存储在服务器端,而 Cookie 数据存储在客户端。 - **安全性**:由于 Session 数据存储在服务器端,因此更安全,适合存储敏感信息。而 Cookie 数据存储在客户端,容易被篡改或窃取。 - **持久性**:Cookie 可以设置过期时间,从而实现长期存储,而 Session 数据通常在会话结束后失效[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值