会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
Cookie
cookies是一种WEB服务器通过 浏览器在访问者的硬盘上存储信息的手段。
一、cookies给网站和用户带来的好处非常多:
1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
二、如何创建Cookie
1 2 3 | Cookie cookie =new Cookie("username","myname"); cookie.setMaxAge(10); //存活期为10秒 response.addCookie(cookie); |
解释:JSP是调用Cookie对象相应的构造函数Cookie(name,value)用合适的名字和值来创建Cookie,然后Cookie可以通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头。
在JSP中,程序是通过cookie.setXXX设置各种属性,用cookie.getXXX读出cookie的属性。
三、读取客户端的Cookie
在Cookie发送到客户端前,先要创建一个Cookie,然后用addCookie方法发送一个HTTP Header。JSP将调用request.getCookies()从客户端读入Cookie,getCookies()方法返回一个HTTP请求头中的内容对应的Cookie对象数组。你只需要用循环访问该数组的各个元素,调用getName方法检查各个Cookie的名字,直至找到目标Cookie,然后对该Cookie调用getValue方法取得与指定名字关联的值。
1 2 3 4 5 6 7 8 | Cookie[] cookies = request.getCookies(); for(Cookie cookie : cookies){ String name = cookie.getName(); if("username".equals(name)){ out.print(cookie.getValue()); } } |
四、设置Cookie的存在时间,及删除Cookie
在JSP中,使用setMaxAge(int expiry)方法来设置Cookie的存在时间,参数expiry应是一个整数。正值表示cookie将在这么多秒以后失效。注意这个值是cookie将要存在的最大时间,而不是cookie现在的存在时间。负值表示当浏览器关闭时,Cookie将会被删除。零值则是要删除该Cookie。如:
1 2 3 4 | Cookie deleteNewCookie=new Cookie("newcookie",null); deleteNewCookie.setMaxAge(0); //删除该Cookie deleteNewCookie.setPath("/"); response.addCookie(deleteNewCookie); |
五、Cookie的小结
① cookie 是在服务端创建
② cookie 是保存在浏览器这端
③ cookie 的生命周期可以通过cookie.setMaxAge(2000);
☞ 如果不设置setMaxAge则该cookie的生命周期当浏览器关闭时,就消亡.。
④ cookie 可以被多个浏览器共享(与session的区别)
⑤ 我们可以把cookie 想成一张表,如果重名就会替换存在的cookie值.
⑥ 一个web应用可以保存多个cookie,但保存在同一个cookie文本在客户端浏览器下
⑦ cookie存放的时候是以明文方式存放,因此安全较低.,我们可以通过加密后保存.
⑧ cookie存放中文:
String val=java.net.URLEncoder.encode(“顺平”,”utf-8″);
Cookie cookie=new Cookie(“name”,val);
取出:
String val=java.net.URLDecoder.decode(cookie.getValue(), “utf-8”);
out.println(“name =”+val);
Session
一、Session的运行机制
1.当一个Session开始时,Servlet容器将创建一个HttpSession对象,在HttpSession对象中可以存放客户状态的信息(例如购物车)。
2.Servlet容器为HttpSession分配一个唯一标识符,称为SessionID。Servlet容器把SessionID作为Cookie保存在客户的浏览器中。
3.每次客户发出HTTP请求时,Servlet容器可以从HttpRequest对象中读取SessionID,然后根据SessionID找到相应的HttpSession对象,从而获取客户的状态信息。
二、HttpSession接口
1.setAttribute(String name,Object value) 将一对name/value属性保存在HttpSession对象中。
2.getAttribute(String name) 根据name参数返回保存在HttpSession对象中的属性值。
3.isNew() 判断是否是新创建的Session。如果是新创建的Session,返回true,否则返回false。
4.setMaxInactiveInterval() 设定一个Session可以处于不活动状态的最大时间间隔,以秒为单位。如果超过这个时间session会自动失效。如果设置为负数,表示不限制Session处于不活动状态的时间。
三、Session的生命周期
1.当客户第一次访问Web应用中支持Session的某个网页时,就会开始一个新的Session。
2.接下来当客户浏览这个Web应用的不同网页时,始终处于同一个Session中。
3.默认情况下,JSP网页都是支持Session的,可以通过以下语句显示声明支持Session:
<%@ page session = “true”>
4.在以下情况中,Session将结束生命周期,Servlet容器会将Session所占用的资源释放掉:
客户端关闭浏览器
Session过期
服务器端调用了HttpSession的invalidate()方法。
在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。对session来说,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
四、跟踪Session的机制
如果客户端浏览器不支持Cookie,servlet容器可以重写客户请求的URL,把SessionID添加到URL信息中。
另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。这种技术现在已较少应用。实际上这种技术可以简单的用对action应用URL重写来代替。
五、Session的小结
① session是存在服务器的内存中
② 一个用户浏览器,独享一个session域对象
③ session中的属性的默认生命周期是30min ,你可以通过 web.xml来修改
④
3种session生命周期的设置
(1)一个地方是 tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>//表示30分钟的意思
</session-config>
对所有的web应用生效
(2)另外一个地方,就是在单个web应用的下去修改 web.xml
<session-config>
<session-timeout>30</session-timeout>session精确到分钟,cookie精确到秒
</session-config>
如果发生冲突,则以自己的web应用优先级高
(3)session.setMaxInactiveinterval(60)发呆六十秒后session失效
除非注明,Coder文章均为原创,转载请以链接形式标明本文地址