HttpSession的使用

1 HttpSession 概述

在 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 的运行机制如下图所示。

2 HttpSession 的创建与使用

(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 HttpSession 对象的存在周期

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 结束时,服务器会清空当前浏览器相关的数据信息。

4 HttpSession 实现新闻系统的用户登录

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 的使用,用户登录成功后,将用户信息保存到会话中。

相关推荐

  1. HttpSession

    2024-01-08 08:02:02       55 阅读
  2. 深入了解HttpSession:Web开发中用户状态管理

    2024-01-08 08:02:02       50 阅读
  3. 自己实现httpsession

    2024-01-08 08:02:02       26 阅读
  4. Servlet技术之Cookie对象与HttpSession对象

    2024-01-08 08:02:02       43 阅读
  5. ThreadLocal使用以及使用场景

    2024-01-08 08:02:02       25 阅读
  6. git使用

    2024-01-08 08:02:02       72 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 08:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 08:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 08:02:02       82 阅读
  4. Python语言-面向对象

    2024-01-08 08:02:02       91 阅读

热门阅读

  1. HTML5 Video(视频)

    2024-01-08 08:02:02       49 阅读
  2. Nginx(二十) 获取真实客户端IP

    2024-01-08 08:02:02       44 阅读
  3. Keil5,ARM编译器限制

    2024-01-08 08:02:02       48 阅读
  4. 【IPC通信--socket套接字--心跳包】

    2024-01-08 08:02:02       42 阅读
  5. MyBatis-基本概念

    2024-01-08 08:02:02       61 阅读