您的位置:首页 > 其它

基于Servlet的会话跟踪

2017-09-21 13:10 387 查看

会话

会话概念
本义是指有始有终的一系列动作、消息
也可指从一个浏览器窗口打开到关闭这个期间
也可以表示客户端浏览器与服务器之间一系列交互的动作
也能指一类用来在客户端与服务器之间保持状态的解决方案(HttpSession)


会话跟踪机制

1、session  服务端会话跟踪  常用
2、cookie    客户端会话跟踪   比较常用
3、url重写。        解决客户端禁用cookie的问题。但是我们开发时默认用户是启用cookie。基本不用。
4、隐藏表单域     上古解决方案、现代已经不用了。


cookie 使用

1、cookie的属性
int      getMaxAge()        返回Cookie过期之前的最大时间,以秒计算。
String      getName()       返回Cookie的名字。名字和值是我们始终关心的两个部分 getName/setName。
String      getPath()       返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
String      getValue()      返回Cookie的值。getValue/setValue。
int         getVersion()        返回Cookie所遵从的协议版本。
void        setMaxAge(int expiry)       以秒计算,设置Cookie过期时间。
void        setPath(String uri)     指定Cookie适用的路径。
void        setValue(String newValue)       cookie创建后设置一个新的值。
void        setVersion(int v)       设置Cookie所遵从的协议版本。   

2、通过使用setMaxAge(int expiry)方法设置Cookie的存在时间,及删除Cookie,参数expiry应是一个整数:
1、正值表示cookie将在这么多秒以后失效。注意这个值是Cookie将要存在的最大时间,而不是Cookie现在的存在时间。
2、负值表示当浏览器关闭时,Cookie将会被删除。
3、零值则是要删除该Cookie。

示例:
Cookie deleteNewCookie=new Cookie("newcookie",null); 
    deleteNewCookie.setMaxAge(0); //删除该Cookie 
    response.addCookie(deleteNewCookie);

3、获取客户端cookie
JSP将调用request.getCookies()从客户端读入Cookie,调用getCookies()方法返回一个HTTP请求头中的内容对应的Cookie对象数组。循环访问该数组的各个元素,调用getName方法检查各个Cookie的名字,直至找到目标Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值

示例:
Cookie myCookie[]=request.getCookies();// 读取客户端Cookie对象数组
// 设立一个循环,来访问Cookie对象数组的每一个元素
for(int n=0;n< myCookie.length;i++){
 Cookie newCookie= myCookie
;
// 判断元素的值是否为username中的值
 if(newCookie.getName().equals("username")){
    System.out.println(newCookie.getValue()); 
}
}

4、分发cookie到客户端。(Cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的Cookie)
//cookie无法直接存储中文、要转码。
String timerUtf8 = URLEncoder.encode(timer,"utf-8");//将字符串timer格式化成网络格式 utf-8编码
//将用户名记录在客户端会话对象cookie中
Cookie cookie = new Cookie("username", un);
//一年之内访问该网站不用输入用户名
cookie.setMaxAge(60*60*24*365);
//分发给客户端
response.addCookie(cookie);

5、 读取cookie中的信息
Cookie[] cookies = request.getCookies();
注意:第一次访问网站时cookie的非空处理。


Servlet中的会话跟踪(session)

1、Servlet提供一种出色的会话跟踪解决方案:HttpSession接口下的session

2、常用方法:

getCreationTime():返回创建Session的时间。

getId():返回分配给这个Session的标识符。

getLastAccessedTime():返回客户端最后一次发出与这个Session有关的请求的时间,如果这个Session是新建立的,返回-1。

getMaxInactiveInterval():返回一个秒数,这个秒数表示客户端在不发出请求时,Session被Servlet引擎维持的最长时间。在这个时间之后,Session可能被Servlet引擎终止。如果这个Session不会被终止,这个方法返回-1。

getValue(String name):返回一个以给定的名字绑定到Session上的对象。如果不存在这样的绑定,返回空值。

getValueNames():以一个数组返回绑定到Session上的所有数据的名称。

invalidate():这个方法会终止这个Session。所以绑定在这个Session上的数据都会被清除。

3、Servlet中会话跟踪步骤

访问与当前请求相关联的会话对象。

调用request.getSession()方法获取HttpSession对象,该对象是一个简单的散列表,用来存储用户服务的相关数据。

查找与会话相关联的信息。

调用HttpSession对象的getAttribute(java.lang.String arg0),得到该参数名称的返回值,并将返回值转换成恰当的类型。

存储会话中的信息

使用setAttribute(java.lang.String arg0,java.lang.Object arg1),设置需要存储的值以及相应的参数名称。

废弃会话数据。

调用removeAttribute(java.lang.String arg0)删除指定的参数名称和参数值。调用invalidate方法删除整个会话。

4、会话超时

1、HttpSession类的setMaxInactiveInterval方法为每个单独的session对象设置失效时间

2、在web.xml中使用session-config和session-timeout元素显式指定在所有服务器上session失效时间

<session-config>
<session-timeout>180</session-timeout>
</session-config>


3、两者区别

session-timeout子元素定义的时间值单位是分钟,然而setMaxInactiveInterval定义的值单位是秒。

如果 session-timeout指定的值是0或负数,session将不会失效,但是setMaxInactiveInterval方法要达到同样的结果,只能设置负数

session和cookie的区别

1、cookie数据存放在客户的浏览器上、将用户的数据写到WEB服务器中该用户独占的session中。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗、 考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多、会比较占用你服务器的性能、考虑到减轻服务器性能方面、应当使用COOKIE。

4、单个cookie保存的数据不能超过4K、很多浏览器都限制一个站点最多保存20个cookie。

建议:

将登陆信息等重要信息存放为SESSION。

其他信息如果需要保留、可以放在COOKIE中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: