JavaWeb Session详解
记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## Session的由来
上一篇博文介绍了Cookie的相关知识,其中介绍了必须采用一种机制来唯一标识一个用户,同时记录该用户的状态。
于是就引入了第一种机制:Cookie机制;那么第二种就是Session机制。
Session机制:采用的是在服务器端保持Http状态信息的方案。结合两篇博文也可以看出两种机制最明显的区别就是cookie是存储子在客户端,
而Session是存储在服务器端。具体两者的区别我会在下一篇博文详细介绍。
Session的定义即基本介绍
Session,有始有终的一系列动作/消息的意思,其实我们举一个小例子来说:比如我们一次打电话,从接起电话到你挂断电话的一系列过程可以称为一个Session。
Session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。
有时候Session也用来指这种解决方案的存储结构。
Session存储方式
服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
Session标识传递的过程
当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),
如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,
可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。
如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个sessionId将在本次响应中返回给客户端保存。
下面是流程图:

Session的几种存储方式
使用Cookie: 保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器,这种cookie称为session cookie。
如下图:

URL重写: 由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,
经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,
另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。
如下图:

Session的创建与删除
- Session创建
(1). 对于Jsp: 若当前页面为浏览器(客户端)访问web应用的第一个资源页面且Jsp的Page指定的Session属性的值为true。
(2). 对于Servlet: 若当前Servlet为浏览器(客户端)访问web应用的第一个资源时,使用request.getSession()或request.getSession(true)创建。 - Session删除
(1). 调用session.invalidate()方法
(2). 卸载web应用程序
(3). 超过了HttpSession的过期时间
Session的超时管理
WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,
WEB服务器还要保留与之对应的HttpSession对象。
随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。
WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,
结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
会话的超时间隔可以在web.xml(Tomcat服务器或者web应用程序)文件中设置,其默认值由Servlet容器定义。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
具体实现
登录页面代码实现
SessionId: <%= session.getId() %>
<br/><br/>
isCreateNew:<%= session.isNew() %>
<br/><br/>
maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
<br/><br/>
CreatedTime:<%= session.getCreationTime() %>
<br/><br/>
lastAccessedTime: <%= session.getLastAccessedTime() %>
<br/><br/>
<%
Object username = session.getAttribute("username");
if(username == null){
username = "";
}
%>
<form action="<%= response.encodeURL("loginSuccess.jsp") %>" method="post">
username: <input type="text" name="username" value="<%= username%>"/><br/>
<input type="submit" value="登录"/>
</form>
登录成功页面代码实现
SessionId: <%= session.getId() %>
<br/><br/>
isCreateNew:<%= session.isNew() %>
<br/><br/>
maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
<br/><br/>
CreatedTime:<%= session.getCreationTime() %>
<br/><br/>
lastAccessedTime: <%= session.getLastAccessedTime() %>
<br/><br/>
Hello: <%= request.getParameter("username") %>
<br/><br/>
<%
//将username存储于session之中,便于在整个会话过程中记住当前user;
// 当然服务器端可以找到session还是通过cookie(URL重写)在客户端和服务器端传递JSESSIONID
session.setAttribute("username", request.getParameter("username"));
%>
<!--
cookie被禁用的情况下使用url重写的方式传递JSSESSIONID;
重写使用:response.encodeURL或response.encodeRedirectURL()都行
-->
<a href="<%= response.encodeURL("login.jsp") %>">重新登录</a>
<a href="<%= response.encodeURL("loginOut.jsp") %>">注销</a>
注销页面实现
SessionId: <%= session.getId() %>
<br/><br/>
isCreateNew:<%= session.isNew() %>
<br/><br/>
maxInActiveInterval:<%= session.getMaxInactiveInterval() %>
<br/><br/>
CreatedTime:<%= session.getCreationTime() %>
<br/><br/>
lastAccessedTime: <%= session.getLastAccessedTime() %>
<br/><br/>
ByeBye: <%= session.getAttribute("username") %>
<br/><br/>
<%
//注销session
session.invalidate();
%>
<a href="login.jsp">重新登录</a>
How to run code
- 将代码clone到本地,使用eclipse导入代码,导入的时候项目的类型选择"git project"。
- 右键项目 run on Server。
法二: 将项目中WebContent中的内容拷入你的Tomccat服务器下的webapps目录下你建的站点名,
然后启动tomcat服务器,
在浏览器中输入: http://localhost:8080/站点名,即可访问
站点页面展示
login页面

loginSuccess页面

loginOut页面

项目文件结构截图

疑问联系
个人博客:http://blog.tommyyang.cn
个人邮箱:tingzai.yang@gmail.comJavaWeb Session详解
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
JavaWeb Session详解的更多相关文章
- 【Hibernate】Hibernate系列2之Session详解
Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器
- PHP5 session 详解【经典】 -- 转帖
PHP5 session 详解[经典] http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越 ...
- Cookie与Session详解
来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议 ...
- orakill和ALTER SYSTEM KILL SESSION详解
--orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...
- 巨人大哥谈Web应用中的Session(session详解)
巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...
- 网络基础 http 会话(session)详解
http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...
- JavaWeb Cookie详解
代码地址如下:http://www.demodashi.com/demo/12713.html Cookie的由来 首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie.我们知道Http协 ...
- 引用 Session详解 作者:郎云鹏
本文转载自leeldy<Session详解 作者:郎云鹏> 引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...
- ASP.NET Session详解(转)
ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...
随机推荐
- Vim文字编辑
首先说明发现的vim编辑器的一个特点:vim编辑只有按[ENTER]键或命令模式下[o]才会换行,否则虽然在vim编辑器里显示的内容换行了,但事实上没有换行.如果你发现自己测试的效果和下面描述的不符, ...
- 多线程之:ThreadLocal
Java中ThreadLocal类可以使创建的变量只被同一个线程进行读和写操作,即使有多个线程同时执行同一段代码,并且这段代码中又有一个指向同一个ThreadLocal变量的引用,这些线程依然不能看到 ...
- easyui常用
清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...
- 解决win10下微信开发者工具点击错位问题
在系统设置->显示->更改文本.应用等项目的大小选项中将百分比改为100%即可.
- 计蒜客 25985.Goldbach-米勒拉宾素数判定(大素数) (2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 B)
若干年之前的一道题,当时能写出来还是超级开心的,虽然是个板子题.一直忘记写博客,备忘一下. 米勒拉判大素数,关于米勒拉宾是个什么东西,传送门了解一下:biubiubiu~ B. Goldbach 题目 ...
- 树的直径【bzoj3363】 [Usaco2004 Feb]Cow Marathon 奶牛马拉松
Description 最近美国过度肥胖非常普遍,农夫约翰为了让他的奶牛多做运动,举办了奶牛马拉松.马拉松路线要尽量长,所以,告诉你农场的地图(该地图的描述与上题一致),请帮助约翰寻找两个最远农场间的 ...
- Codeforces Round #325 (Div. 2) Laurenty and Shop 模拟
原题链接:http://codeforces.com/contest/586/problem/B 题意: 大概就是给你一个两行的路,让你寻找一个来回的最短路,并且不能走重复的路. 题解: 就枚举上下选 ...
- [LOJ6280]数列分块入门 4
题目大意: 给你一个长度为$n(n\leq50000)$的序列$A$,支持进行以下两种操作: 1.将区间$[l,r]$中所有数加上$c$: 2.询问区间$[l,r]$在模$c+1$意义下的和.思路: ...
- 为添加了自定义域名的GitHub Pages添加SSL,启用强制HTTPS(小绿锁)
直奔主题 为什么要使用https协议? 提高网站访问安全性,网络连接都是加密的 (PS:虽然SSL并不是无懈可击的,但是我们应该尽可能提高窃听成本). 目前越来越多的浏览器会判断当前站点支不支持htt ...
- Spring/Spring MVC/Spring Boot实现跨域
说明:Spring MVC和Spring Boot其实用的都是同一套. CORS介绍请看这里:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Acc ...