Servlet之Session域

本文主要探讨了Servlet中的Session域技术,介绍了HttpSession如何作为服务端会话管理工具,并提供了一个简单的实现示例,最后进行了相关测试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HttpSession-服务端会话技术

HttpSession 域对象 可以存东西
服务器会为每一个用户创建一个独立的HttpSession

HttpSessionn 原理
当Servlet第一次访问Servlet的时候 服务器端会给该用户创建一个独立的Session
并且生成一个SessionID,这个Session在响应浏览器的时候 会被装进cookie中
从而被保存在浏览器中 当用户下一次再一次访问Servlet的时候,请求中会携带着cookie中的SessionID去访问
服务器会根据这个sessionID去查看是否有Session对象 有就拿出来使用
没有 就创建一个Session(相当于第一次访问)

域的范围
Context域 > Session域 > Request域
Session域 只要会话不结束,就会存在 但是Session有默认的存活时间 30分钟
简单实现
在访问网址中?后面加上一条信息,在demo01中通过请求捕获这条信息,再通过request获取session域,将这条信息保存到
session域中,由于session域存在的时间较长,只要会话不关闭,session便可存在(30分钟),且一个用户对应一个session
此时再用demo02获取这条session,将session中username里的值取出来,输出到网页
public class Demo01 extends HttpServlet {

    public 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");
        HttpSession session = request.getSession();
        session.setAttribute("username", username);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
public class Demo02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        HttpSession session = request.getSession();
        String username = (String)session.getAttribute("username");
        response.getWriter().write(username);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
<servlet>
  <servlet-name>user</servlet-name>
  <servlet-class>com.lanou3g.Demo01</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>user</servlet-name>
  <url-pattern>/user</url-pattern>
</servlet-mapping>

<servlet>
  <servlet-name>demo02</servlet-name>
  <servlet-class>com.lanou3g.Demo02</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>demo02</servlet-name>
  <url-pattern>/demo02</url-pattern>
</servlet-mapping>

这里写图片描述
这里写图片描述

测试

只要服务器和浏览器不关闭,一个用户便只有一个session,此时将两本书添加到购物车中,然后查看购物车的内容,
可以看到添加的两本书籍,此时刷新浏览器,但不关闭浏览器,再次查看购物车中的内容,任然可以看到添加进的书籍
当关闭浏览器时,再进去查看购物车,书籍将消失
  模拟购物功能
  大概需要几个页面来完成 --- 需要几个Servlet
  需要:
  三个servlet类
  书类 id bookName
  模拟假数据的类
  map集合 HashMap<String,Book>
  方法: 根据ID获取对应的书
  1 --- 葵花
  2 --- 辟邪
  3 --- 九阴

 钝化:服务器停止时 如果你的session中存了对象 并且该对象实现了序列化接口Serializable
 系统会把你保存的session序列化到服务器的work文件夹你的工程下一个文.件
 活化:当你重新启动了服务器,系统会重新把钝化下来的那个文件加载为session中
package com.lanou3g.car;

import java.io.Serializable;
public class Book implements Serializable{

    private static final long serialVersionUID = 1L;
    private String id;
    private String name;
    public Book() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Book(String id, String name) {
        super();
        this.id = id;
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Book [id=" + id + ", name=" + name + "]";
    }
}
package com.lanou3g.car;
/*
* 模拟假数据
*/

import java.util.HashMap;

public class BookUtil {
// 声明一个保存书的容器
private static HashMap<String, Book> books = new HashMap<>();
// 添加数据
static {
    books.put("1", new Book("1","葵花宝典"));
    books.put("2", new Book("2","九阴真经"));
    books.put("3", new Book("3","辟邪剑谱"));
    books.put("4", new Book("4","如来神掌"));

}
// 获取集合的方法
public static HashMap<String,Book> getBooks(){
    return books;
}
// 按id查找对应书的方法
public static Book findBookById(String id) {
    return books.get(id);
}
}
public class ShowAllBooks extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
    response.setContentType("text/html;charset=UTF-8");
    request.setCharacterEncoding("UTF-8");

    HashMap<String, Book> books = BookUtil.getBooks();
    PrintWriter out = response.getWriter();
    for (String key : books.keySet()) {
        Book book = books.get(key);
        // 响应到网页上
        out.write(" <a href='" +request.getContextPath()+"/AddBook?id="+book.getId()+"'>"+book.getName()+"</a><br/>");
    }
    // 添加查看购物车的连接
    out.write("<a href='"+request.getContextPath()+"/showCar'>查看购物车</a>");

    // 设置session有效时间
    request.getSession().setMaxInactiveInterval(10);
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
}
public class AddBook extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    request.setCharacterEncoding("UTF-8");

    // 获取点击的是那本书(获取参数)
    String id = request.getParameter("id");
    Book book = BookUtil.findBookById(id);
    // 创建一个容器(相当于购物车 保存买的书)
    // 两种情况 1.已经存过书了 2没存过
    HttpSession session = request.getSession();
    ArrayList<Book> car = (ArrayList)session.getAttribute("car");
    if(car == null) {
        // 相当于第一次访问 创建容器
        car = new ArrayList<>();
    }
    // 把书添加到容器中
    car.add(book);
    // 把这个容器添加到session中
    session.setAttribute("car", car);
    // 显示添加成功
    // 1秒后返回商品列表项
    response.setHeader("refresh", "1;url=/sh-web-servlet06/ShowAllBooks");
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doGet(request, response);
}
public class showCar extends HttpServlet {

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

        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        HttpSession session = request.getSession();
        ArrayList<Book> cars = (ArrayList<Book>)session.getAttribute("car");
        if(cars == null) {
            out.write("购物车为空");
            // 2秒跳回 商品列页面
            response.setHeader("refresh", "2;url="+request.getContextPath()+"/ShowAllBooks");
        }else {
            // 遍历输出
            for (Book book : cars) {
                out.write(book + "<br/>");
            }

        }
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
public class DoLogin extends HttpServlet {

    public 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 pwd = request.getParameter("pwd");
        String code = request.getParameter("code");
        PrintWriter out = response.getWriter();
        // 是否wanglong 123

        if("wanglong".equals(userName) && "123".equals(pwd)) {
            HttpSession session = request.getSession();
            String wcode = (String)session.getAttribute("wcode");
            if(wcode.equalsIgnoreCase(code)) {
                out.write("欢迎登陆");
            }else {
                // 使用request域 保存 验证码错误的信息
                request.setAttribute("msg", "你验证码输入错误");
                // 请求转发
                request.getRequestDispatcher("/1.jsp")
                .forward(request, response);
            }
        }else {
            out.write("用户名或密码错误");
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function changeCode() {
        /*从文档中取出img图片*/
        var img = document.getElementsByTagName("img")[0];
        /*获取图片的src属性 并赋值
          注意:如果请求的网址完全相同 则浏览器不会帮你刷新
          可以拼接当前时间 让每次请求的网址都不一样
        */
        img.src = "/sh-web-servlet06/codeServlert?time=" + new Date().getTime();
    }
</script>
</head>
<body>

    <%
        // 书写java代码
        // 获取request中的数据
        String msg = (String)request.getAttribute("msg");
        if(msg != null){
            out.write(msg);
        }
    %>
    <form action="/sh-web-servlet06/doLogin" method="post">
        用户名:<input type="text" name="userName"/><br>
        密码:<input type="password" name="pwd"/><br>
        验证码:<input type="text" name="code"/>
        <img src="/sh-web-servlet06/codeServlert" onclick="changeCode()"/>
        <a href="javascript:changeCode()">看不清换一张</a>
        <br>
        <input type="submit" value="登录"/><br>
    </form>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值