session讲解

什么是session

屏幕截图 2025-09-07 151441
session相当于一个柜子,而sessionid相当于柜子的钥匙,只返回给用户一把钥匙(sessionid),我们可以往session里面存东西,只需要在取东西的时候用sessionid去取。而cookie是把存的数据也一起都给用户了。

  1. 服务器会给每一个用户创建一个session对象,
  2. 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
  3. 用户登录之后,整个网站都可以进行访问。:保存用户的信息,保存购物车信息

与servletcontext

都是数据共享的方式,但是session更好,因为servletcontext数据多的时候系统容易崩溃

实现数据使用session代码

//s1
package com.xin.servlet;

import com.xin.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-16");
        resp.setContentType("text/html;charset=utf-16");
        PrintWriter out = resp.getWriter();
        HttpSession session = req.getSession();
        session.setAttribute("name",new Person("熙熙",20));
        String sessionId = session.getId();
        if (session.isNew()){
            resp.getWriter().write("创建成功:"+sessionId);
        }else {
            resp.getWriter().write("已经存在了:"+sessionId);
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
//s2
package com.xin.servlet;

import com.xin.pojo.Person;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-16");
        resp.setContentType("text/html;charset=utf-16");
        HttpSession session = req.getSession();
        Person person =(Person) session.getAttribute("name");
        System.out.println(person.toString());

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
package com.xin.pojo;

public class Person {
    private String name;
    private  int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

注销session

  1. 手动注销:
    当我们先注销session之后,再进入s2会报错500,空指针异常是因为person类异常,再重新先进入s1就会另外创建一个新id
package com.xin.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionDemo03 extends HttpServlet {
    @Override
    //注销session
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //会马上注销但是会生成一个另外的新的,这是手动注销
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}
  1. 自动过期
    web.xml配置设置有效期
<session-config>
        <!--15分钟后session会自动失效,以分钟为单位,可以都写,在用户忘记注销时,页面自动可以注销-->
        <session-timeout>15</session-timeout>
    </session-config>

可以都写,在用户忘记注销时,页面自动可以注销

session使用场景

  1. 保存用户登录信息
  2. 购物车信息
  3. 经常在整个网站中会使用的数据,将他保存在session中。

session和cookie区别

sessionid是区分不同用户的标志,它可以通过cookie发送给用户。

  1. cookie是把用户的数据写到用户的浏览器,浏览器保存。(可以保存多个)
    session是把用户的数据写到用户独占的session中,服务端保存(每个浏览器都不一样)。保存重要的信息,减少服务器资源的浪费。
  2. session对象由服务器创建
    cookie是客户端发送请求后,响应过来创建的
  3. session可以存string和object
    cookie只可以存string,不可以存object
posted @ 2025-09-07 15:19  xixixixin  阅读(41)  评论(0)    收藏  举报