代码地址如下:
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. OpenGL入门学习(五)

    http://developer.178.com/201103/94955548786.html 今天要讲的是三维变换的内容,课程比较枯燥.主要是因为很多函数在单独使用时都不好描述其效果,我只好在最后 ...

  2. C程序编译过程浅析【转】

    转自:http://blog.csdn.net/koudaidai/article/details/8092647 前几天看了<程序员的自我修养——链接.装载与库>中的第二章“编译和链接” ...

  3. python grequests和requests比较

    #!/usr/bin/env python # encoding: utf-8 import grequests import requests import timeit import time d ...

  4. C++内联汇编,输出人物名字

    DWORD PeopleBase =0x9CD674;//天龙人物基址 //获取人物名称 char * CData::GetPeopleName() {     char * name="& ...

  5. 第一章:1-11、在上题的分组交换网中,设报文长度和分组长度分别为x和(p+h)(bit),其中p为分组的数据部分的长度,而h为每个分组所带的控制信息固定长度,与p的大小无关。通信的两端共经过k段链路。链路的数据率为b(bit/s),但传播时延和结点的排队时间均可忽略不计。若打算使总的时延为最小,问分组的数据部分长度p应取为多大?

    <计算机网络>谢希仁著第四版课后习题答案答: 分组个x/p, 传输的总比特数:(p+h)x/p 源发送时延:(p+h)x/pb 最后一个分组经过k-1个分组交换机的转发,中间发送时延:(k ...

  6. 在ros下使用tf

    tf真是一个好东西,把坐标变换都简化了 首先tf需要有一个broadcaster #include <ros/ros.h> #include <tf/transform_broadc ...

  7. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  8. Ubuntu角色登录答疑

    1.su 命令验证出错: $ su - rootPassword: su: Authentication failureSorry. 这时候输入 $ sudo passwd rootEnter new ...

  9. HDU 6301.Distinct Values-贪心、构造字典序最小的数列 (2018 Multi-University Training Contest 1 1004)

    HDU6301.Distinct Values 这个题就是给你区间要求区间内的数都不相同,然后要求是字典序最小,直接贪心走一遍,但是自己写的时候,思路没有错,初始化写挫了... 将区间按左端点小的排序 ...

  10. POJ 2923 【01背包+状态压缩/状压DP】

    题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. F ...