第二章_session管理
2.1 URL重写
URL重写是Session追踪技术。须要将一个或多个token做为一个查询字符串加入到一个URL中。
Token的格式通常是键=值。
Url?key-1=value-1&key-2=value-2...&key-n=value-n
2.2 隐藏域
利用隐藏域来保持状态,与採用网址重写技术类似。但它不是将值加入到URL后面,而是将他们放在HTML表单的隐藏域中。当用户提交表单时,隐藏域的值也传送到server。仅仅有当页面包括表单。或者能够在页面中加入表单时,才适合使用隐藏域。
这样的技术胜过网址重写的地方在于。能够将很多其它的字符传到server。而且不须要进行字符编码。可是像网址重写一样,也仅仅有当要传递的信息不须要跨越多个页面时。才适合使用这样的技术。常见的隐藏域我们用来显示id,这样方便编辑的时候能够依据id获取到值显示出来。
2.3 Cookie
Cookie是自己主动在Webserver和浏览器之间来回传递的一小块信息。
Cookie适用于那些须要跨越很多页面的信息。因为cookie是做为HTTP标头嵌入的,因此传输他的过程由HTTP协议处理。除此之外,还能够依据自己的须要设置cookie的有效期限。
对于Web浏览器而言,每台Webserver最多能够支持20额cookie。
Cookie的不足之处在于,用户能够通过改动他的浏览器设置来拒绝接受cookie。
要使用cookie,必须熟悉javax.servlet.http.cookie类,以及HttpServletRequest和HttpServletResponse接口中的几个方法。
要创建一个cookie,传递一个名称和一个值给Cookie类的构造器:
Cookie cookie = new Cookie(name,value) ;
比如。要创建一个选择语言的cookie。能够这么写:
Cookie languageSelectionCookie = new Cookie(“language”,”Italian”) ;
创建cookie之后,能够设置他的domain、path及maxAge属性。
尤其值得关注的是maxAge属性,由于它决定cookie的有效期。
httpservletResponse.addCookie(cookie);
当浏览器再次发出对同一个资源或者对同一台server中的不通资源的请求时。它会同一时候把从Web浏览器处收到的cookie再传回去。
要訪问浏览器发出的cookie,能够在HttpServletRequest中使用getCookies方法。该方法将返回一个Cookie数组。假设请求中没有cookie,将返回null。为了找到某个名称的cookie。须要迭代数组。以下举个样例,看看怎样读取一个名为maxRecords的cookie。
Cookie[] cookies = request.getCookies() ;
Cookie maxRecordsCookie = null ;
if(cookies != null){
for(Cookie cookie:cookies){
if(cookie.getName().equals("maxRecords")){
maxRecordsCookie = cookie ;
break ;
}
}
}
令人遗憾的是,没有getCookieByName方法能够使获取cookie变得更简单一些。
更令人难过的是。也没有方法能够直接删除cookie。为了删除cookie。须要创建一个同名的cookie,将它的maxAge属性设置为0,并在HttpServletResponse中加入一个新的cookie。看看以下是怎样删除一个名为userName的cookie的:
Cookie cookie = new Cookie(“userName”,””) ;
cookie.setMaxAge(0) ;
response.addCookie(cookie) ;
2.4 HttpSession对象
HttpSession是当一个用户第一次訪问某个站点时自己主动创建的。
通过在HttpServletRequest中调用getSession方法,能够获取用户的HttpSession。getSession有两个重载方法:
HttpSession getSession()
HttpSession getSession(boolean create)
无參的getSession方法返回当前的HttpSession。假设当前没有,则创建一个并返回。
getSession(false)方法返回当前的HttpSession(若有),假设没有,则返回null。getSession(true)方法返回当前的HttpSession(若有),假设没有,则新建一个并返回。
getSession(true)和getSession是一样的。
放在HttpSession中的值是保存在内存中的。
加入到HttpSession中的值不一定是String,能够为随意java对象,仅仅要它的类实现了java.io.Serializable接口就可以,以便当Servlet容器觉得有必要的时候,保存的对象能够序列化成一个文件或者保存到数据库中,比如。当容器的内存快要用完的时候。仍然能够将非序列化的对象保存在HttpSession中,可是假设Servlet容器试图将他们序列化,将会以失败告终,并抛出异常。
通过在HttpSession中调用getAttribute方法,同一时候传递一个属性名称,能够获取HttpSession中保存的对象。
这种方法的签名例如以下:
java.lang.Object getAttribute(java.lang.String name)
HttpSession中还有一个实用的方法是getAttributeNames。它返回一个Enumeration,迭代一个HttpSession中的全部属性:
java.util.Enumeration<java.lang.String> getAttributeNames()
注意,HttpSession中保存的值不发送到client,这与其它的Session管理方法不同。而是servlet容器为它所创建的每个HttpSession生成一个唯一标识符。并将这个标识符做为一个token发送给浏览器,通常是做为一个名为JSESSIONID的cookie,或者做为一个jessionid參数加入到url后面。在兴许的请求中。浏览器会将这个token发送回server。使server可以知道是哪个用户在发出请求。不管servlet容器选择用哪一种方式传输session标识符,那都是在后台自己主动完毕的,不须要你去做额外的处理工作。
Java.lang.String getId()
HttpSession中还定义了一个invalidate方法。这种方法强制Session过期,并将绑定到它的全部对象都解除绑定。
在默认情况下。HttpSession是在用户静默一定时间之后过期,能够在部署描写叙述符的session-timeout元素中将session的期限设置为整个应用程序。比如,将这个值设为30,使全部session对象在用户最后一次訪问之后30分钟过期。假设没有配置这个元素。这个期限将由servlet容器决定。
非常多时候,还须要销毁未过期却又无用的HttpSession实例,以便释放一些内存空间。
能够调用getMaxInactiveInterval方法,以了解一个HttpSession在用户最后一次訪问之后还能够维持多久。这种方法返回用户离开的秒数。setMaxInactiveInterval方法能够帮助你为个别HttpSession的Session期限设置一个不同的值。
Void setMaxInactiveInterval(int seconds)
假设向这种方法传递0,那么HttpSession将永远不会过期。
一般来说,这不是一个好方法,由于HttpSession占用的堆(heap)空间将永远不会释放,直到应用程序卸载或Servlet集装箱特写。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
第二章_session管理的更多相关文章
- 【odoo14】第二章、管理odoo实例
本章主要介绍肖odoo实例添加用户自定义的模块.你可以从多个路径载入模块.但是建议你将自己的模块儿放在特定的目录当中,避免与odoo的核心模块混淆. 在这一章节,中我们主要涉及以下内容: 配置插件路径 ...
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
- 第二章· Redis管理实战
数据类型 管理实战 数据类型 String: 字符串类型 Hash: 哈希类型 List: 列表类型 Set: 集合类型 Sorted set: 顺序集合类型 管理实战 通用操作
- HttpClient4.3教程 第二章 连接管理
2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已 ...
- [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】
作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...
- 【NPDP笔记】第二章 组合管理
2.1 什么是产品组合 Product Portfolio 什么是组合管理,讲述的是完成正确的项目, 五大目标 财务稳健,财务目标 管道平衡,资源需求与可用资源之间的平衡 战略协同,与经营战略 组织战 ...
- 《深入理解linux内核架构》第二章 进程管理和调度
2.1进程优先级 进程优先级 硬实时进程 软实时进程 抢占式多任务处理 2.2进程生命周期 用户太切换到核心态的办法 系统调用 中断 抢占调度模型优先级普通进程<系统调用<中断 普通进程可 ...
- FreeRTOS官方翻译文档——第二章 队列管理
2.1 概览基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的小程序.这些独立的任务之间很可能会通过相互通信以提供有用的系统功能.FreeRTOS 中所有的通信与同步 ...
- kvm第二章--虚拟机管理
随机推荐
- 在Java中怎样逐行地写文件?
下边是写东西到一个文件里的Java代码. 执行后每一次,一个新的文件被创建,而且之前一个也将会被新的文件替代.这和给文件追加内容是不同的. public static void writeFile1( ...
- jQuery cxSelect 多级联动下拉菜单
随着电商热门,这种多层次的互动更充分地体现在下拉菜单,最明显的是多级联动地址下拉选择,因此,这里是一个简单的分享 jQuery cxSelect 多级联动下拉菜单 cxSelect 它是基于 jQue ...
- flex 错误信息类型及解决方法
总结一些经常出现的异常信息及处理方法(会一直持续更新): 异常1: 写actionscript3.0时遇到了错误.报错为:Error #2044: 未处理的 ioError:. text=Error ...
- ceSetThreadPriority设置线程优先级~!
ceSetThreadPriority 一直採用SetThreadPriority,结果今天发帖询问线程时间问题,才突然顿悟...发现SetThreadPriority只设置248-255,也就是说就 ...
- 关于产品的一些思考——腾讯之QQ音乐
--------------------2014.5.11-------------------- 原来一直使用小米手机自带的音乐播放器,除了搜歌下载不方便,其它的还好(省电是最大的长处),用过Jin ...
- HDU 1201
18岁生日 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- 解决TabActivity中子页面不通过导航跳转到还有一个页面的问题
问题:当你的导航在TabActivity中 而子页面的一个button须要切换到当中的某一个导航页面 转载请注明出处:http://blog.csdn.net/x605940745 demo下载地址: ...
- Parallel Python——一个简单的分布式计算系统
如何建立一个高速的分布式计算平台?Parallel python此目的. Parallel Python(http://www.parallelpython.com/content/view/15/3 ...
- Linux shell用法和技巧(转)
使用Linux shell是我每天的基本工作,但我经常会忘记一些有用的shell命令和l技巧.当然,命令我能记住,但我不敢说能记得如何用它执行某个特定任务.于是,我开始在一个文本文件里记录这些用法,并 ...
- javaweb学习总结(七)——HttpServletResponse对象(一)(转)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...