JAVAEE HttpSession

本文深入讲解了HTTP Session的工作原理及应用实例,包括Session如何在服务器端为每个用户创建独立会话,Session ID如何通过Cookie保存并传递,以及Session在实际项目如购物车中的具体实现。

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

HttpSession

昨天博客已经提到了会话有两个技术 第一种是已经解释的cookie 第二种就是今天要谈论的session
session 是一个服务端技术
服务器会为每一个用户创建一个独立的HttpSession
HttpSession 原理:
1. 当用户第一次访问servlet 服务器端会给该用户创建一个独立的session
2. 并且生成一个sessionID
3. 这个SessID 在响应浏览器的时候 会被装进cookie中 从而被保存到浏览器中
4. 当用户再一次访问servlet的时候 请求中会携带着 cookie中的sessionID 来访问
5. 服务器会根据这个sessionID 来查看是否有对应的sessionID 对象 有就取出使用 否则就创建新的session(相当于用户第一次访问)
因此session 和 之前的 request 和 context 很像 是一个 域对象 他们的范围大小是 Context 域 > Session 域 > request 域
session域特点是 session域 只要会话不结束 就会存在 但是 Session有默认的存活时间 30分钟

创建第一个session

// Demo01.java
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"); 
        // 获取session对象
        HttpSession session = request.getSession();
        // 保存数据
        session.setAttribute("username", username);
        System.out.println(session.getId());

    }

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

}
// Demo02.java
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");  
         // 获取session中的数据
        HttpSession session = request.getSession();
        String username = (String) session.getAttribute("username");
        // 响应到网页
        response.getWriter().write(username +" "+ session.getId()); 
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

简单购物车问题

ShowAllBooks.java
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");
        PrintWriter out = response.getWriter();
        HashMap<String,Book> books = Bookutil.getBooks();

        Set<String> keySet = books.keySet();
        for (String string : keySet) {
            Book book = books.get(string);
            out.write("<div><a href='"+request.getContextPath()+"/addbook?id="+book.getId()+"'>"+book.getName()+"</a></div>");

        }
        // 添加查看购物车连接
        out.write("<div><a href='" + request.getContextPath() + "/showbook'>查看购物车</a></div>");  
        // 设置session的有效时间
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(10);
    }

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


Book.java
public class Book implements Serializable{

    /**
     * Session 
     * 钝化 服务器停止 如果你在session中保存了对象 并且该对象实现了序列化接口Serializable
     *      系统会把你保存的session 序列化到 服务器的work文件夹 work文件夹下
     * 
     * 活化
     *  当你重新启动服务器 系统会重新把钝化下的文件加载回session中
     */
    private static final long serialVersionUID = 1L;
    private String id;
    private String name;

    public Book() {
        // 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 + "]";
    }
}


Bookutil.java
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", "JAVA编程思想"));
    }

    // 获取集合的方法
    public static HashMap<String, Book> getBooks() {


        return books;
    }
    // 按id 查找对应书的方法
    public static Book findBookById(String id) {
        return books.get(id);
    }
}


AddBook.java
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");
        HttpSession session = request.getSession();
        // 获取点击的是哪本书
        Book books = Bookutil.findBookById(id);
        // 创建一个容器       
        // 把这个容器添加到session中
        // 两种情况 1. 书已经添加 2. 书没有添加
        ArrayList<Book> book = (ArrayList<Book>) session.getAttribute("id");
        if (book == null) {
            // 相当于 第一次访问 创建容器
            book = new ArrayList<>(); 
        }
        // 把书添加到容器中
        book.add(books);
        // 把容器添加到session中
        session.setAttribute("id", book);
        // 显示添加成功 1秒后返回商品列表
        response.getWriter().write("添加成功 1秒钟后跳转");
        response.setHeader("refresh", "1;url=/sh-web-servlet04/showallbooks");
    }

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

}

ShowBook.java

public class ShowBook 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();
        ArrayList<Book> list = (ArrayList<Book>) session.getAttribute("id");
        if (list != null) {
            for (Book book : list) {
                response.getWriter().write(book.getName() + "<br/>");
            }
        } else {
            response.getWriter().write("暂无商品" + "<br/>");
            response.setHeader("refresh", "1;url=/sh-web-servlet04/showallbooks");
        }
    }

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值