代码地址如下:
http://www.demodashi.com/demo/12756.html

记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + ## 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的几种存储方式

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

    如下图:

  2. URL重写: 由于cookie可以被人为的禁用,必须有其它的机制以便在cookie被禁用时仍然能够把session id传递回服务器,

    经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,

    另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

    如下图:

Session的创建与删除

  1. Session创建

    (1). 对于Jsp: 若当前页面为浏览器(客户端)访问web应用的第一个资源页面且Jsp的Page指定的Session属性的值为true。

    (2). 对于Servlet: 若当前Servlet为浏览器(客户端)访问web应用的第一个资源时,使用request.getSession()或request.getSession(true)创建。
  2. 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

  1. 将代码clone到本地,使用eclipse导入代码,导入的时候项目的类型选择"git project"。
  2. 右键项目 run on Server。

法二: 将项目中WebContent中的内容拷入你的Tomccat服务器下的webapps目录下你建的站点名,

然后启动tomcat服务器,

在浏览器中输入: http://localhost:8080/站点名,即可访问

站点页面展示

login页面

loginSuccess页面

loginOut页面

项目文件结构截图

疑问联系

个人博客:http://blog.tommyyang.cn

个人邮箱:tingzai.yang@gmail.comJavaWeb Session详解

代码地址如下:
http://www.demodashi.com/demo/12756.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

JavaWeb Session详解的更多相关文章

  1. 【Hibernate】Hibernate系列2之Session详解

    Session详解 2.1.概述-一级缓存 2.2.操作session缓存方法 2.3.数据库隔离级别 2.4.持久化状态 2.5.状态转换 2.6.存储过程与触发器

  2. PHP5 session 详解【经典】 -- 转帖

    PHP5 session 详解[经典] http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议.所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的.而越 ...

  3. Cookie与Session详解

    来源:<PHP核心技术与最佳实践> 列旭松 陈文 著 Cookie与Session详解读书笔记,从概念.操作.应用.注意事项以及区别等几方面详细阐述两者的基础知识,它们都是针对HTTP协议 ...

  4. orakill和ALTER SYSTEM KILL SESSION详解

    --orakill和ALTER SYSTEM KILL SESSION详解[转]-----------------------------------------2013/11/05 一个用户进程偶尔 ...

  5. 巨人大哥谈Web应用中的Session(session详解)

    巨人大哥谈Web应用中的Session(session详解) 虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一技术. ...

  6. 网络基础 http 会话(session)详解

    http 会话(session)详解 by:授客 QQ:1033553122 会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一. ...

  7. JavaWeb Cookie详解

    代码地址如下:http://www.demodashi.com/demo/12713.html Cookie的由来 首先我们需要介绍一下,在Web开发过程中为什么会引入Cookie.我们知道Http协 ...

  8. 引用 Session详解 作者:郎云鹏

    本文转载自leeldy<Session详解 作者:郎云鹏>   引用 leeldy 的 Session详解 作者:郎云鹏 目录: 一.术语session 二.HTTP协议与状态保持 三.理 ...

  9. ASP.NET Session详解(转)

    ASP.NET Session详解 本文章来自:http://blog.163.com/adam601@126/blog/static/22506317200932824210996/ 当用户在 We ...

随机推荐

  1. linux用户态定时器的使用---19【转】

    转自:http://www.cnblogs.com/zxouxuewei/p/5095288.html 原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuew ...

  2. android与java的关系

    摘自:http://bbs.51cto.com/thread-944897-1.html   相信学习android的人都会想过或者想知道这个问题,那就请你耐心的看完这篇文章吧,你会对android与 ...

  3. 原生JavaScript实现jQuery的hasClass,removeClass,addClass,toggleClass

    介绍: 1.hasClass:判断DOM元素是否存在类. 2.addClass:为的DOM元素添加类. 3.removeClass:删除DOM元素的类. 4.toggleClass:如果DOM元素存在 ...

  4. 获取Json对象的长度以及判断json对象是否为空

    (如有错敬请指点,以下是我工作中遇到并且解决的问题) = = = = = = = = = = = = = = = =  获取Json对象的长度  = = = = = = = = = = = = = = ...

  5. kubernetes 安装(全)

    #http://blog.csdn.net/zhuchuangang/article/details/76572157#https://kubernetes.io/docs/setup/indepen ...

  6. ZOJ3874 Permutation Graph(NTT&&cdq分治)

    最近在看几道整体二分还有cdq分治的东西,突然间想起前几个礼拜的ZOJ题,然后看了一下代码,经过了一些深思熟虑之后,发现自己终于看懂了,下面就用别人的代码来剖析一下整个解题的思路吧,具体的内容我再看看 ...

  7. mydumper备份

    1.安装工作 cd /usr/local/softwareyum install -y glib2-devel  zlib-devel pcre-develwget https://launchpad ...

  8. 随手看的一本书《java微服务》,测试成功了其中的第一个样例

    静态语言,JAVA应该多了解,结合微服务,DOCKER,再搞搞SPRING CLOUD,就能跟上时代了. 对了,链一个买书的地址: https://item.jd.com/12089180.html ...

  9. Netty源码学习(二)NioEventLoopGroup

    0. NioEventLoopGroup简介 NioEventLoopGroup可以理解为一个线程池,内部维护了一组线程,每个线程负责处理多个Channel上的事件,而一个Channel只对应于一个线 ...

  10. 集合框架(Collection和Collections的区别)

    1.Collection: java.util.Collection 是一个集合接口. 它提供了对集合对象进行基本操作的通用接口方法.Collection接口在Java 类库中有很多具体的实现.Col ...