Head First Servlets & JSP 学习笔记 第六章 —— 会话状态
MVC中的M(模型),通常就是一个普通的类,这个类里面的信息就是业务逻辑。
会话(Session)
我们可以使用一个HttpSession对象,来保存横跨多个请求的会话状态。
HTTP协议使用的是无状态连接。客户浏览器与服务器建立连接,发出请求,得到响应,然后关闭连接。换句话说,连接只为一个请求/响应存在。对于Web容器而言,每一个连接都是一个新的客户。
那么Web容器怎么记住这是同一个客户,还是另外一个新客户呢?这个时候,客户就需要一个唯一的会话ID。
对于一个客户的第一个请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户。这个客户在以后的每一个请求中再把会话ID发到Web容器,这样,Web容器就可以区分不同的客户了。
那么又有一个问题:客户和Web容器怎么交换会话ID这个信息呢?答案就是:通过cookie。
HttpSession session1 = request.getSession(); //无参数版本的getSession(),无论如何都会返回一个会话,要么是新建的,要么是之前就有的
if(session1.isNew()){
syso("这是一个新创建的会话");
else
syso("这是一个已有的会话"); HttpSession session2 = request.getSession(false); //有参数版本的getSession(),返回null或者一个之前就有的会话
if(null == session2)
syso("这个会话不存在“);
else
syso("这是一个已有的会话");
那么又有一个问题:有些客户会禁用cookie,这怎么办?答案就是:URL重写。
也就是说,为了能识别是同一个客户还是新客户,需要交换会话ID,最简单的交换办法是用cookie,不行再用URL重写。
删除不再需要的会话?会话对象占用着资源,Web容器怎么确定这个会话要不要删除?
会话有三种死法:①超时 ②主动调用invalidate()方法 ③应用结束
cookie实际上就是在客户和服务器之间交换的一小段数据(一个名/值对)。
Cookie cookie = new Cookie("username", "2bconfident"); //创建一个新的cookie对象
cookie.setMaxAge(30*60); //设置cookie在浏览器上存活的最大时间:30分钟
HttpSession的重要里程碑,一生中的重要时刻:创建和撤销会话。
前面的章节,我们知道在分布式应用上,有多个服务器,也就有多个JVM。一个JVM有一个ServletContext,一个JVM有多个Servlet,所以有多个ServletConfig,一个Servlet对应一个ServletConfig。
但是HttpSession对象,无论有多少JVM,一个应用中只有一个HttpSession对象,只有一个SessionID(会话ID)。
Head First Servlets & JSP 学习笔记 第六章 —— 会话状态的更多相关文章
- Head First Servlets & JSP 学习笔记 第三章 —— MVC迷你教程
临渊羡鱼,不如退而结网!是时候动手搞事情了! 我们的四大步骤: ①分析用户的视图(也就是浏览器要显示的东西),以及高层体系结构: (这个就是所谓的前端吧?用JSP?JSP可以当成Html来用吧?高层体 ...
- Head First Servlets & JSP 学习笔记 第十一章 —— Web应用部署
jar:java archive(java归档) war:web archive(web归档) war文件只是Web应用结构的一个快照,采用了一种更可移植的压缩形式(它实际上就是一个jar文件).建立 ...
- Head First Servlets & JSP 学习笔记 第七章 —— 作为JSP
<%@ …… %> 这是指令 <%@ page ……import="java.util.Date" %> 这是page指令,import是page指令的一个 ...
- Head First Servlets & JSP 学习笔记 第五章 —— 作为Web应用
初始化参数:(init-param) 初始化参数写在web.xml文件中:(写在<servlet>标签内部) <servlet> <servlet-name>Bee ...
- Head First Servlets & JSP 学习笔记 第十三章 —— 过滤器的威力
过滤器可能是最强大的Web应用开发工具了! 与Servlet非常类似,过滤器就是Java组件,请求发送到Servlet之前,可以用过滤器截获和处理请求:另外Servlet结束工作之后,但在响应发回给客 ...
- Head First Servlets & JSP 学习笔记 第四章 —— 作为Servlet
Servlet的任务是得到一个客户的请求,再发回一个响应. 请求: 容器控制着Servlet的一生,它会创建请求和响应对象.为Servlet创建一个新线程或分配一个线程,另外调用Servlet的ser ...
- JVM学习笔记-第六章-类文件结构
JVM学习笔记-第六章-类文件结构 6.3 Class类文件的结构 本章中,笔者只是通俗地将任意一个有效的类或接口锁应当满足的格式称为"Class文件格式",实际上它完全不需要以磁 ...
- C Primer Plus 学习笔记 -- 前六章
记录自己学习C Primer Plus的学习笔记 第一章 C语言高效在于C语言通常是汇编语言才具有的微调控能力设计的一系列内部指令 C不是面向对象编程 编译器把源代码转化成中间代码,链接器把中间代码和 ...
- Linux学习笔记(第六章)
第六章-档案权限与目录配置#chgrp:改变档案的所属群组#chown:改变档案的拥有者#chmod:改变档案的权限及属性 chown用法 chmod用法: r:4 w:2 x:1对于文档: 对于目录 ...
随机推荐
- ORM操作 数据库外键 一对多
创建外键: from django.db import models class usergroup(models.Model): uid = models.AutoField(primary_key ...
- 问题 Windows7VMware14安装虚拟机时出现 此主机不支持虚拟化实际模式。需要具备 Intel“VMX 不受限客户机”功能才能在 Intel 处理器上运行此虚拟机。 模块“CPUIDEarly”启动失败。
问题 Windows7VMware14安装虚拟机时出现 此主机不支持虚拟化实际模式.需要具备 Intel“VMX 不受限客户机”功能才能在 Intel 处理器上运行此虚拟机. 模块“CPUIDEarl ...
- sql server紧急状态下登录脚本
--打开xp_cmdshell功能 EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35) @configv ...
- tomcat 绑定域名 防止恶意域名绑定
http://aaronlong31.iteye.com/blog/1123260 今天公司一台服务器被很多恶意域名绑定了,电信的要我们赶紧处理,否则封IP. 服务器使用的是tomcat,上谷歌搜了很 ...
- Flask--(项目准备)--添加日志
日志:记录程序运行的状态,在manage.py同级目录下创建logs文件夹 定义日志文件: import logging from logging.handlers import RotatingFi ...
- STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点
近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...
- 彻底理解js中this的指向,不必硬背
来自 https://blog.csdn.net/u011088260/article/details/79230661 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行 ...
- server2012 多用户远程桌面
这个服务器是客户提供的,阿里云平台的服务器.版本是windows-server2012,拿过来的时候,只有一个windows系统,啥都没有. 我们公司的数据库开发设计人员,B/S开发人员,APK开发人 ...
- [UE4]Slider
Slider:滑动条 一.Slider.Bar Thickness:滑动条厚度 二.Slider.Appearance.Step Size:每次滑动的步进值 三.Slider.Appearance.V ...
- 知识点:Mysql 基本用法之流程控制
流程控制 一. 条件语句 if 语句实例: delimiter // CREATE PROCEDURE proc_if () BEGIN declare i int default 0; if i = ...