Session
来源:互联网 发布:上海国金网络朱文君 编辑:程序博客网 时间:2024/05/01 12:22
一HttpSession概述
1.1什么是HttpSession
HttpSession接口表示一个会话。注意,一个浏览器独占一个Session对象(默认情况下),因此需要保存数据时,可以把数据保存在浏览器独占的Session中,当用户使用浏览器访问其它程序时,其它程序可以从Session中取出数据,为用户服务。
1.2获取HttpSession对象
*****HttpSession request.getSession();
方法介绍:如果当前会话中,已经有了Session对象,则直接返回Session对象,如果不存在,那么创建Session对象,并返回。
*****HttpSession request.getSession(boolean);
方法介绍:当参数为true时,如果当前会话中存在Session对象,那么直接返回Session对象,如果没有则创建Session对象,并返回,即和上面的方法一样;如果参数为false,如果当前会话中存在Session对象,那么直接返回Session对象,如果不存在,则返回null;
1.3HttpSession是域对象
javaweb中一共有四个域对象,其中Servlet可以使用其中的三个:request, session, ServletContext,jsp还可以使用PageContext。
HttpSession域对象方法介绍
*****void setAttribute(String name, Object value)
方法介绍:用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;
*****Object getAttribute(String name)
方法介绍:用来获取session中的数据,当前在获取之前需要先去存储才行,例如:
String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性;
*****void removeAttribute(String name)
方法介绍:用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那本方法什么都不做;
*****Enumeration getAttributeNames()
方法介绍:获取所有域属性的名称;
二Session的实现原理
Session的低层是依赖Cookie的,下面我们来理解一下Session的实现原理。
我们先来看个故事。我们是如何实现在银行存钱这件事的?银行怎么知道在它那的钱属于谁?
当我们第一次去银行的时候,因为还没有账号,所以我们需要开户,这时我们获取的是银行卡(上面有账号),而银行这边在数据库中留下了我的账号,我的钱保存在银行的账号中,而我带走的是银行卡(账号)。
当我们下次再去银行的时候,带上我们的银行卡,银行就知道了我的账号,而无需再开卡,也不会弄错。
对于Session呢?
当我们首次使用Session时,服务器会创建Session,Session是保存在服务器端,而给客服的是Session的ID(通过Cookie来给),客服端带走的是sessionId,而数据保存在Session中。
当下次再访问服务器的时候,只需要带上sessionId,而服务器就能够根据这个sessionId来找到对应的Session,而无需重新创建Session。
三Session与浏览器
Session保存在服务器,而SessionID通过Cookie发送给客服端,但如果没有设置Cookie的生命的话,Cookie的默认只在浏览器内存内存在,即,一旦关闭浏览器,Cookie也就消失了。
当用户再次打给浏览器进行访问,这时,就不会Session发给服务器,服务器就会认为你没有Session,就会重新创建一个新的Session。并把SessionID通过Cookie发给客服端。
你很可能会问,那原来那个Session会怎么办呢,对于原来的那个Session,服务器会发现这个Session很久没人用,就会把它给删了。这个时长在tomcat中配置的时间是30分钟,也可以自己修改配置延迟或缩短时间,在/conf/web.xml中进行配置,也可以在自己的web工程的web.xml中进行配置。示例如下:
<session-config> <session-timeout>30</session-timeout> </session-config>
四Session其它常用API
*****String getId()
方法介绍:获取sessionId;
*****int getMaxInactivelnterval();
方法介绍:获取Session可以的最大不活动时间,默认情况下是30分钟,当Session在30分钟内没有被使用,那么comcat会在Session池移除这个Session。
*****void setMaxInactiveInterval(int interval)
方法介绍:设置Session允许的最大不活动时间(单位为妙),如果设置时间为1秒钟,那么只要Session在1秒
钟内没有被使用,那么Session就会被移除。
*****long getCreateTime()
方法介绍:返回Session的创建时间,返回值为当前时间的毫秒值;
*****long getLastAccessedTime()
方法介绍:返回Session的最后活动时间,放回值为当前时间的毫秒值;
*****void invalidate()
方法介绍:让Session失效!调用这个方法会让Session失效,当Session失效后,客服端再次请求,
服务器会为客服端创建一个新的Session,并在响应中给客服端新Session的sessionId;
*****boolean isNew()
方法介绍:查看Session是否为新的Session。当客服端第一次请求时,服务器为客服端创建Session,但这
时还没有响应给客服端,也就是没有把sessionId响应给客服端,这时Session的状态为新。
五URL重写
我们知道Session依赖Cookie,为Session会依赖Cookie呢,因为服务器需要在每次请求中获取sessionId,然后找到对应的客服端的Session。但如果在没有设置Cookie的生命的情况下,浏览器关闭了怎么办?你肯定会说那可以设置Cookie的生命,把Cookie保存到了硬盘上,那如果浏览器禁用了Cookie呢?
其实这个时候我们还有一种技术可以使服务器得到客服端的sessionId,那就是URL重写。在每个页面中的链接和表单后面加上名为jSessionId的参数,值为当前的sessionId,这样,当通过点击链接或提交表单时,服务器就可以根据jSessionId这个参数来得到sessionId,从而找到Session。
在链接和表单中添加jSessionId的方法
链接:<a href="/javawebname/xxx;jSessionId=当前sessionId值"></a>
表单:<form action="/javawebname/xxx;jSessionId=当前sessionId值" method="get"></form>
特别需要注意的是:通过这种方式进行URL重写,加上jSessionId这个参数时,不是用&而是用;(分号)。
如果觉得上述方式比较麻烦,也可以使用response.encodeUrl(String url),对每个请求的url进行处理,这个方法会自动追加jSessionId参数,与上述方法功能一样。
而且这个方法还非常智能,它会自动判断,当前浏览器是否禁用了Cookie,如果检测到禁用了Cookie会自动在每个请求的URl后面添加jSessionId参数,如果没有禁用Cookie,就不会添加jSessionId这个参数。
- Session
- session
- Session
- session
- session
- Session
- Session
- SESSION
- session
- session
- Session
- session
- session--
- session
- session
- session
- session
- session
- 【bzoj 3946】 无聊的游戏 - 线段树套可持久化Treap
- 圣诞CF
- 剑指Offer之面试题18:树的子结构
- POJ 2046 Gap 笔记
- Roman to Integer
- Session
- 剑指Offer之面试题19:二叉树的镜像
- SM-SQL建表语句
- 关于 quartz 1.6.1 的一个死等问题,导致任务不执行
- 剑指Offer之面试题20:顺时针打印矩阵
- SM-AJAX的servlet回传json时乱码问题的解决
- node.js回调函数
- POJ 3134 Power Calculus 笔记
- SM-js判断input-text输入值并进行反馈