关于B/S结构系统的会话机制(session机制)

本文详细介绍了HTTP会话Session的概念、作用及其实现原理。Session用于保存用户会话状态,解决HTTP无状态问题。服务器生成SessionID并发送给浏览器,通过Cookie存储。若Cookie禁用,可通过URL重写维持会话。此外,文章还提及了Session与Request、Application域对象的关系以及它们的常用方法。
摘要由CSDN通过智能技术生成


前言

一、session是什么?

  • 用户打开浏览器,进行一系列操作,然后最终将浏览器关闭,这个整个过程叫做:一次会话。会话在服务器端也有一个对应的java对象,这个java对象叫做:session。(注意:session对象是服务器端创建的!)
//从服务器中获取session对象
HttpSession session = request.getSession();//如果没有获取到任何session对象则新建
HttpSession session = request.getSession(false);//如果获取不到session,则不会新建,返回一个null
  • 什么是一次请求:用户在浏览器上点击了一下,然后到页面停下来,可以粗略认为是一次请求。请求对应的服务器端的java对象是:request。
  • 一个会话当中包含多次请求。(一次会话对应N次请求。)
  • session对象最主要的作用是:保存会话状态。

二、session对象来保存会话状态

为什么需要session对象来保存会话状态呢?

  • 因为HTTP协议是一种无状态协议。
  • 什么是无状态:请求的时候,B和S是连接的,但是请求结束之后,连接就断了。HTTP协议为什么要设计成这样?因为这样的无状态协议,可以降低服务器的压力。请求的瞬间是连接的,请求结束之后,连接断开,这样服务器压力小。
  • 只要B和S断开了,那么关闭浏览器这个动作,服务器知道吗? 不知道。服务器是不知道浏览器关闭的。

三、session实现原理(面试常问)

  • session列表在服务器端类似于一个Map集合,map的key是sessionid,map的value是session对象。
  • 用户第一次请求,服务器生成session对象,同时生成sessionid,并将sessionid发送给浏览器。
  • 用户第二次请求,自动将浏览器内存中的sessionid发送给服务器,服务器根据id查找session对象。
  • 关闭浏览器,内存中保存的sessionid消失,会话等同于结束。重新打开浏览器之后内存中没有这个sessionid,自然找不到服务器中对应的session对象。(注:session对象在服务器端可能还存在。session对象的两种销毁方式:1、超时销毁 2、手动销毁)
<!--设置session的超时时长是30分钟-->
    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>

1.原理测试

代码如下:

public class TestServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTf-8");
        PrintWriter out  = response.getWriter();
        HttpSession session = request.getSession();
        out.print("session对象:"+session);
    }
}

第一次用户在浏览器发送请求时,服务器生成session对象,同时生成sessionid,并将sessionid发送给浏览器(response):
在这里插入图片描述
用户第二次请求,自动将浏览器内存中的sessionid发送给服务器,服务器根据id查找session对象(request)。
在这里插入图片描述
所以,Cookie:JSESSIONID=xxxxxx。sessionid是以cookie的形式保存在浏览器内存中的。关闭浏览器,内存消失,cookie消失,sessionid消失,会话结束。

2.cookie禁用

cookie禁用是什么意思?

  • 答:服务器正常发送cookie给浏览器,但是浏览器不要了。拒收了。并不是服务器不发了。浏览器每一次请求都会获取到新的session对象。

cookie禁用了,session机制还能实现吗?(面试常问)

  • 答: 可以。需要使用URL重写机制。例如:http://localhost:8080/servlet12/test/session;jsessionid=19D1C99560DCBF84839FA43D58F56E16。
  • URL重写机制会提高开发者的成本。开发人员在编写任何请求路径的时候,后面都要添加一个sessionid,给开发带来了很大的难度,很大的成本。所以大部分的网站都是这样设计的:要是禁用cookie,就别用了。

总结

  • 到目前位置我们所了解的域对象:
    • request(对应的类名:HttpServletRequest)
      • 请求域(请求级别的)
    • session(对应的类名:HttpSession)
      • 会话域(用户级别的)
    • application(对应的类名:ServletContext)
      • 应用域(项目级别的,所有用户共享的。)
  • 这三个域对象的大小关系
    • request < session < application
  • 他们三个域对象都有以下三个公共的方法:
    • setAttribute(向域当中绑定数据)
    • getAttribute(从域当中获取数据)
    • removeAttribute(删除域当中的数据)
  • 使用原则:尽量使用小的域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值