[原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用
内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。
本人互联网技术爱好者,互联网技术发烧友
微博:伊直都在0221
QQ:951226918
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1.定义:session在Web开发环境下,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。
2.session机制
1)session机制采用的是在服务器端保持 HTTP 状态信息的方案
2)服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息
3)当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId)。
如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。
3.保存session id的几种方式
1)保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。
2)由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种:
一种是作为URL路径的附加信息;
一种是作为查询字符串附加在URL后面;
网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id;
4.Session cookie
1)session通过SessionID来区分不同的客户, session是以cookie或URL重写为基础的。默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,这称之为session cookie,以区别persistent cookies(也就是我们通常所说的cookie),session cookie是存储于浏览器内存中的,并不是写到硬盘上的,通常看不到JSESSIONID,但是当把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递;
2)session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本;
3)关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象消失,同样也不会使已经保存到硬盘上的持久化cookie消失。
5.HttpSession 的声明周期
1).什么时候创建 HttpSession 对象
① 对于JSP:是否浏览器访问服务器端的任何一个JSP, 服务器都会立即创建一个 HttpSession 对象呢?不一定。
> 若当前的 JSP 是客户端访问的当前 WEB 应用的第一个资源,且 JSP 的 page 指定的 session 属性值为 false,
则服务器就不会为 JSP 创建一个 HttpSession 对象;
> 若当前 JSP 不是客户端访问的当前 WEB 应用的第一个资源,且其他页面已经创建一个 HttpSession 对象,
则服务器也不会为当前的JSP 页面创建一个HttpSession 对象,而会把和当前会话相关联的那个HttpSession 对象返回给当前的JSP 页面;
② 对于Servlet:若Servlet 是客户端访问的第一个WEB 应用的资源,
则只有调用了request.getSession() 或者 request.getSession(true) 才会创建 HttpSession 对象
2).page指令中的 session=“false“ 到底表示什么意思?
> 当前 JSP 页面禁用 session 隐含变量!但可以使用其他的显式的 HttpSession 对象
如:HttpServlet session = request.getSession(false);
3).在Servlet 中如何获取HttpSession 对象?
> request.getSession(boolean create):
若参数为 false, 则 若没有和当前JSP 页面关联的HttpSession 对象,则返回 null , 若有 则返回 关联的 HttpSession 对象
若参数为 true, 一定返回一个HttpSession 对象,若没有和当前JSP 页面关联的HttpSession 对象,则服务器创建一个新的HttpSession 对象,若有,直接返回关联的HttpSession对象
> request.getSession():等同于 request.getSession(true)
4).什么时候销毁HttpSession 对象
① 直接调用HttpSession 的invalidate() 方法,使当前的HttpSession 对象失效。即,以后每次刷新页面就会重新创建一个HttpSessioin 对象
② 服务器卸载了当前的 WEB 应用
③ 超出HttpSession 的过期时间: 以秒为单位
>session.setMaxInactiveInterval(interval) //设置 session 过期的时间 ,默认是 30分钟
>session.getMaxInactiveInterval(); //获取 sesson 过期时间
> 在web.xml 文件中设置HttpSession 的过期时间 : 单位为分钟。在$TOMECAT_HOME/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
④ 并不是关闭了浏览器就销毁了HttpSession:url重写,持久化cookie
5).利用URL重写实现Session跟踪
① Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。
这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数
② 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。
如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写
HttpServletResponse接口中定义了两个用于完成URL重写方法: encodeURL方法 encodeRedirectURL方法
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>session login JSP</title>
</head>
<body> SessionId :<%= session.getId() %>
<br><br> IsNew:<%= session.isNew() %>
<br><br> MaxInactiveInterval:<%= session.getMaxInactiveInterval() %>
<br><br> CreateTime:<%= session.getCreationTime() %>
<br><br> LastAccessTime:<%= session.getLastAccessedTime() %>
<br><br>
<%
Object username = session.getAttribute("username");
if(username == null){
username = "";
}
%> <form action="<% response.encodeURL("login.jsp") %>" method="post"> username:<input type="text" name="username" value="<%= username %>"/>
<input type="submit" value="submit"/>
</form> </body>
</html>
6.Session的创建与删除
1)一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true) 或者 HttpServletRequest.getSession()这样的语句时才会被创建
2)session在下列情况下被删除:
① 程序调用HttpSession.invalidate()
② 距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
③ 服务器进程被停止
3)关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效
[原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)的更多相关文章
- [原创]java WEB学习笔记04:Servlet 简介及第一个Servlet程序(配置注册servlet,生命周期)
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记95:Hibernate 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记11:HttpServlet(HttpServletRequest HttpServletRsponse) 以及关于 Servlet 小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记28: 会话与状态管理Cookie 机制
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记15:域对象的属性操作(pageContext,request,session,application) 及 请求的重定向和转发
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记52:国际化 fmt 标签,国际化的总结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- [原创]java WEB学习笔记51:国际化 概述,API 之 locale类,dataFormat类,numberFormat类, MessageFormat类,ResourceBundle 类
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- 转 拉姆达表达式,委托、匿名方法、Lambda表达式的演进
总结:Lambda表达式的语法:(参数列表=>执行语句) 无参数格式 :()=>{执行语句} 有参数格式:x=> x % 2 == 0 1.假设给我们一个泛型对象List<T& ...
- python--pipe
1.pipe 除了使用队列外,还可以使用管道在进程间执行消息传递 pipe([]duplex) 在进程间创建一条管道,并返回元组(conn1,conn2),其中conn1和conn2是表示管道两端的C ...
- hbase和mapreduce开发 WordCount
代码: /** * hello world by world 测试数据 * @author a * */ public class DefinedMapper extends Mapper<Lo ...
- 高度平衡树 -- AVL 树
Scheme 的表达, 优雅. #lang scheme ( define nil '() ) ( define ( root tree )( car tree ) ) ( define ( left ...
- Java并发基础:了解无锁CAS就从源码分析
https://segmentfault.com/a/1190000015881923
- 三层登录实例VB.NET版具体解释---理论加实战篇
层,百度百科这样解释,首先-重叠起来的东西:重叠起来的东西中的一部分:层次|表层|大气层.其次-重叠.反复:层峦叠嶂|层出不穷.最后-量词,用于能够分出层次的事物.女孩儿强烈的第六感,三层中的层一定是 ...
- TBSchedule源码阅读1-TBScheduleManagerFactory
TBSchedule 1 TBScheduleManagerFactory 初始化 成员变量 ZKManager; IScheduleDataManager; Schedule ...
- bat命令遍历文件和bat参数说明
**************************************************************************************************** ...
- Python装饰器 计时器记录方法执行性能
import time def timeit(func): def wrapper(): start = time.clock() func() end =time.clock() print 'us ...
- MySQL 下 ROW_NUMBER / DENSE_RANK / RANK 的实现
原文链接:http://hi.baidu.com/wangzhiqing999/item/7ca215d8ec9823ee785daa2b MySQL 下 ROW_NUMBER / DENSE_RAN ...