在 Java Servlet API 中引入 session 机制来跟踪客户的状态。session 指的是在一段时间内,单个客户与 Web 服务器的一连串相关的交互过程。在一个 session 中,客户可能会多次请求访问同一个网页,也有可能请求访问各种不同的服务器资源。
在 Servlet API 中定义了 javax.servlet.http.HttpSession 接口,Servlet 容器必须实现这个接口。当一个 session 开始时,Servlet 容器创建一个 HttpSession 对象,并同时在内存中为其开辟一个空间,在 HttpSession 对象中可以存放客户状态的信息(例如购物车)。Servlet容器为 HttpSession 分配一个唯一标识符,称为 SessionID。Servlet 容器把 SessionID 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取SessionID,然后根据 SessionID 找到相应的 HttpSession 对象,从而获取客户的状态信息。
Session 的运行机制如下图所示。
(1)创建
Servlet 中的 HttpServletRequest 对象为我们提供了以下两种创建和获取 HttpSession 对象的方法:
HttpSession session=request.getSession(boolean value);
HttpSession session=request.getSession();
那么这两种方法有什么区别呢?
在第一种方法中,布尔值为 true 时,如果存在与当前请求关联的会话,就返回该会话。否则创建一个新的会话,并把该会话返回。布尔值为 false 时,如果存在与当前请求关联的会话,就返回该会话。否则返回 null,不再创建会话。
第二种方法等同于第一种方法中的布尔参数值为 true 时的情况。
(2)使用
在 javax.servlet.http.HttpSession 接口中定义的方法,我们常用的是有关进行数据存取的方法。
session.setAttribute(String name,Object value) ;
session.getAttribute(String name);
setAttribute(String name,Object value)是把一个对象 value 保存在 HttpSession 对象中,并为其指定引用名称为 name。当我们想使用已经存储在 session 中的数据时,我们可以使用 session.getAttribute(String name)方法,把数据取出来。其中 name 为我们在存入数据时,指定的引用名称。值得注意的是,session.getAttribute(String name)方法的返回值是 Object类型,所以在取出数据时,我们要对其进行数据类型转换,而且必须与我们存入的数据类型一致。如 String value=(String)session.getAttribute(String name);
3.1 HttpSession 对象的创建
当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的 HttpSession 对象。在服务器端使用 request.getSession()方法来获得 HttpSession 对象,并以此来使用HttpSession 接口为我们提供的方法。
3.2 HttpSession 对象的使用
在创建 HttpSession 对象后,使用该对象进行数据的存取,以进行数据的传递。在此过程中我们常用的方法如下。
(1)void setAttribute(String name,Object value ):进行数据的保存。
(2)Object getAttribute( String name):进行数据的读取。
3.3 HttpSession 对象的结束
在以下 3 种情况下,可以结束 session。
(1)关闭浏览器,关闭 session。
(2)调用 HttpSession 的 invalidate()方法,删除 HttpSession 对象和数据。
(3)两次访问时间间隔大于 session 定义的非活动时间间隔。
在 session 结束时,服务器会清空当前浏览器相关的数据信息。
UserServlet 为处理用户注册以及登录的 Servlet,其代码如下:
package com.example.demo;
public class UserServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse
response)throws ServletException, IOException {
//设置编码格式
// response.setContentType("text/html;charset=UTF-8");
// request.setCharacterEncoding("utf-8");
//接收用户信息
String userName = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String method = request.getParameter("method");
//调用 Service 方法进行业务逻辑处理
UserServiceImpl userService = new UserServiceImpl();
UserDao userDao = new UserDaoImpl();
userService.setUserDao(userDao);
boolean bLogin = false;
User user = new User();
user.setUserName(userName);
user.setPassword(password);
if (method != null && method.equals("addUser")){
user.setEmail(email);
user.setUserType(Constants.USER_TYPE_COMMON);
bLogin = userService.addUser(user);
}else{
bLogin = userService.isLogin(userName, password);
System.out.println("blogin="+bLogin);
}
if (bLogin){
request.getSession().setAttribute("admin",userName);
request.getSession().setAttribute("user",user);
}
//响应页面
request.getRequestDispatcher("index.jsp").forward(request,response);
// response.sendRedirect("index.jsp");
}
protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
doGet(request, response);
}
}
以上代码的黑体部分就是 HttpSession 的使用,用户登录成功后,将用户信息保存到会话中。