【java学习笔记】基于Cookie的Session会话技术(介绍+工作原理+流程分析+常见API)

12 篇文章 1 订阅

session介绍

先前的博客中已经介绍了Cookie会话技术,在本文章中将介绍总结Session技术。
Session技术是以Cookie技术为基础的,这也是这篇文章的标题,只要理解了它们之间的联系和区别,你就对B/S通信能有个大致的了解。

和Cookie相比 session 是一种更安全的存储对象。Cookie的信息存储于客户端,用户可以随时查看和修改,而Session信息存储于服务器,用户不可见。

Cookie可见
可见

session不可见在这里插入图片描述

session工作原理

session是基于Cookie实现的。
当用户第一次访问服务器时,服务器会创建一个Session 同时也会创建一个Cookie 记录下用户的信息,值得关注的是Cooike的JSESSION的值正是Session 的id值,这是文章标题的由来,随后将新创建的包含当前用户信息的Session存储到服务器内存中。服务器响应时将带有session id值的Cookie返回给客户端。
当用户再次访问服务器时,就会携带着含有Session id 值的Cookie,通过在服务器获取到Session得id 值,然后拿着这个id去服务器内存遍历Session对象,找到对应id的用户Session信息。服务器就知道你是上一次访问过我的用户。
session技术是基于Cookie实现的。
那么假如我们将已经返回给客户端的Cookie数组全清空,那么也就不存在能够依靠Cookie中的id值,找到用户Session信息。事实证明这是正确的,即使是Session还在生命周期之内。
在这里插入图片描述

实现流程分析

初次访问,会创建一个新的session,并且也创建了一个Cookie,返回给客户端,并且此时的Cookie的JSESSION属性值是Session的id(图片右下脚)
在这里插入图片描述再次访问,请求头中携带着包含session id 的Cookie
在这里插入图片描述删除所有Cookie后再去访问
1.Cookie已删除
在这里插入图片描述2.再次访问
虽然Cookie已经被全部删除,id属性也没有了,就查不到Session,就会创建一个新的session(此时CookieJSEEION属性值依旧和Seesion 的id相等)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ba59c946c3f04584863002c371de856b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5pyo5YWwX1dV,size_20,color_FFFFFF,t_70,g_se,x_16

Session常见的API

session客户端不可见,那么如何才能看到session信息呢?
既然session对象存储在服务器中,当然是通过后端对session信息进行读取啦

Session常见的API

  • request.getSession()//创建或获取Session对象
    //对上面的代码进行解释:当服务器内存中不存在请求对象的Session时,就会主动给请求对象创建一个Session;当服务器内存中存在时,就得到请求对象对应的Session

  • session.isNew()//判断当前的session对象是否是新创建的

  • session.getId()//获取当前session的ID
    //对上面的代码进行解释:每个session在被创建时,服务器都会给它分配一个唯一的ID值,用于标识当前用户

  • session.setAttribute()//以键值对的形式对session信息进行存储

  • session.getAttribute(String key)//有写就有读,以键值对的形式对session信息进行读取

  • session.getMaxInactiveInterval()//设置session的最长超时时间(生命周期)
    //对上面的代码进行解释:最长超时时间指的是

实现代码

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

/**
 * @ProjectName session会话技术
 * @ClassName sessionServlet
 * @Description //
 * @Email 2992794262@qq.com
 * @Author ASUS
 * @Date 2021/11/20
 **/
@WebServlet(name = "SessionServlet",urlPatterns ="/sessionServlet" )
public class SessionServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //创建session,和获取session
        HttpSession session = req.getSession();
        //判断 session是否首次创建
        boolean isNew = session.isNew();
        //获取session的id唯一标识
        String id = session.getId();
        resp.getWriter().write("session唯一的id值是" + id+"</br>");
        resp.getWriter().write("session是否是第一次创建" + isNew+"</br>");

        //设置session的key和value
        session.setAttribute("key1","value1");
        resp.getWriter().write("已经往session域保存了信息"+"</br>");

        //获取session的value值
        Object value = session.getAttribute("key1");
        resp.getWriter().write("key1的值是"+value+"</br>");

        //TODO session的生命周期
        //获取session的超时时长
        int timeOut = session.getMaxInactiveInterval();
        resp.getWriter().write("session的最大超时时长是" + timeOut+"</br>");
        //设置session的超时时长为5秒
        session.setMaxInactiveInterval(5);
        timeOut = session.getMaxInactiveInterval();
        resp.getWriter().write("修改后session的最大超时时长是" + timeOut+"</br>");
        //让session已经设置为超时,被销毁
        //session.invalidate();
       // resp.getWriter().write("session已经被设置了超时");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值