Servlet中HttpSession使用

1 HttpSession会话跟踪原理

服务器会为每一个用户创建一个独立的HttpSession对象。

  1. 当用户第一次访问Servlet时,服务器端会给用户创建一个独立的HttpSession对象,并且生成一个Session ID,这个Session ID在响应浏览器的时候会被装进Cookie中,从而被保存到浏览器中。
  2. 当用户再一次访问Servlet时,请求中会携带着Cookie中的Session ID去访问
  3. 服务器会根据这个Session ID去查看是否有对应的HttpSession对象。有就拿出来使用(服务器会认为用户已经访问过);没有就创建一个新的HttpSession (服务器这时会认为用户第一次访问)

2 如何获得HttpSession对象

HttpServletRequest接口提供了两种方法来获取HttpSession的对象:

方法名称 说明
public HttpSession getSession() 返回与此请求关联的当前会话,或者如果该请求没有会话,则创建一个。
public HttpSession getSession(boolean create) 返回与此请求关联的当前HttpSession,或者,如果没有当前会话且create为true,则返回一个新会话。

3 HttpSession常用方法

方法名称 说明
public String getId() 返回包含唯一标识符值的字符串。
public long getCreationTime() 返回创建此会话的时间,以1970年1月1日0点以来的格林威治标准时间(为毫秒数单位)。
public long getLastAccessedTime() 返回客户端最后一次发送与此会话相关联的请求的时间,以1970年1月1日0点以来的格林威治标准时间(为毫秒数单位)。
public void invalidate() 使此会话无效,把绑定到HttpSession的所有对象解绑。

4 HttpSession的案例

在下面的示例中,我们在一个Servlet的会话范围内设置属性,并从另一个Servlet的会话范围获取该值。为了在会话范围内设置属性,我们使用了HttpSession接口的setAttribute()方法,并且为了获取属性,我们使用了getAttribute方法。

4.1 编写页面

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>一点教程网-HttpSession案例</title>
</head>
<body>
<form action="servlet1">
    用户名:<input type="text" name="userName"/><br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

4.2 编写FirstServlet

FirstServlet:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class FirstServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{

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

            String n=request.getParameter("userName");
            out.print("欢迎 "+n);

            HttpSession session=request.getSession();
            session.setAttribute("uname",n);

            out.print("<a href='servlet2'>访问</a>");

            out.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.3 编写SecondServlet

SecondServlet:

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class SecondServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        try{

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

            HttpSession session=request.getSession(false);
            String n=(String)session.getAttribute("uname");
            out.print("你好 "+n);

            out.close();

        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.4 配置web.xml

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <servlet>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>FirstServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/servlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SecondServlet</servlet-name>
        <servlet-class>SecondServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>SecondServlet</servlet-name>
        <url-pattern>/servlet2</url-pattern>
    </servlet-mapping>

</web-app>

4.5 运行测试

点击“提交”,如下:

点击“访问”,如下:

一点教程,一个分享编程知识的公众号。跟着站长一起学习和进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「一点教程」,你已然超越了90%的程序员!

一点教程二维码