Session

一 概念

服务器端会话技术一次会话的多次请求间共享数据数据保存在服务器端的对象HttpSession

二 快速入门

2.1 HttpSession对象的常用方法

获取HttpSession对象

使用HttpSession对象

SessionDemo1

package Session;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用session共享数据
        //1.获取session
        HttpSession session = req.getSession();
        //2.存储数据
        session.setAttribute("msg","kong");
    }
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

SessionDemo2

package Session;
​
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
​
import java.io.IOException;
​
/**
 * @author shijiu
 */
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //使用session获取数据
        //1.获取session
        HttpSession session = req.getSession();
        //2.获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
​
​
    }
​
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

三 原理

Session的实现是依赖于Cookie的

 浏览器第一次请求服务器 服务器创建一个session对象 服务器第一次响应时 回加一个响应头set-cookie 浏览器会将cookie保存 

第二次请求服务器时 会带着cookie访问 这时服务器就知道两次请求时是同一个会话 可以将数据保存到一个共有的session对象

四 细节

1.当客户端(浏览器)关闭后 服务端不关闭 两次获取session是否为同一个?

默认情况下不是同一个

如果希望客户端关闭后 session也能相同 

采用如下方式

创建cookie 设置属性

因为本身就是靠cookie传递的嘛 也就是说 只要每次请求传递的cookie符合条件 这些请求就可以看做是一次会话 可以共用一个session保存共有数据

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //使用session获取数据
    //1.获取session
    HttpSession session = req.getSession();
    //期待客户端关闭后 session也能相同
    Cookie cookie = new Cookie("JSESSIONID", session.getId());
    //存活时间
    cookie.setMaxAge(60*60);
    resp.addCookie(cookie);
    System.out.println(session);
}

2.客户端不关闭 服务器关闭后 两次获取的session是同一个吗?

不是同一个 但是要保证数据不丢失

  • session的钝化

    • 在服务器正常关闭之前 将session对象序列化到硬盘上

  • session的活化

    • 服务器启动后 将session文件转化为内存中的session对象即可

3.session什么时候被销毁

  • 服务器关闭

  • session对象调用invalidate方法

  • 默认失效时间30min

五 特点

  1. session用于存储一次会话的多次请求的数据 存在服务器端

  2. session可以存储任意类型 任意大小的数据

session与cookie的区别

  • session存数据在服务器端 cookie在客户端

  • session没有数据大小限制 cookie有

  • session数据安全 cookie相对于不安全

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值