7、会话跟踪技术
更新时间:2023-12-23 19:01:01 阅读量: 教育文库 文档下载
会话跟踪技术
? 什么是会话跟踪技术
在javaweb中,打开浏览器后,从客户第一次向服务器的任何一个网页发送请求开始,则与该服务器开启了一个会话,到客户关闭浏览器该次会话结束。(如果客户访问服务器连续超过30分钟没有任何新的请求,则会话也会结束,直到重新开启新的会话。30分钟是默认值,我们可以在程序中修改,比如银行的账户登录的超时时间一般会设置的较短) 在一个会话的多个请求中共享数据,这就是会话跟踪技术。 会话根据技术是使用cookie和session完成的。 HTTP协议是无状态协议,也就是说每个请求都是独立的!无法记录前一次请求的状态。但HTTP协议中可以使用Cookie来完成会话跟踪! 在JavaWeb中,使用session来完成会话跟踪,session底层依赖Cookie技术。 ? Cookie技术 2.1
什么是cookie
Cookie就是一个键和一个值构成的,第一次访问某个网站随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会自动把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了! 2.2 cookie相关规范
l l l Cookie大小上限为4KB; 一个服务器最多在客户端浏览器上保存20个Cookie; 一个浏览器最多保存300个Cookie; 注意,不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时,服务器会把Cookie发给IE,然后由IE保存起来,当你在使用FireFox访问服务器时,不可能把IE保存的Cookie发送给服务器。 2.3 Cookie与HTTP头
Cookie是通过HTTP请求和响应头在客户端和服务器端传递的: l Cookie:请求头,客户端发送给服务器端; ? 格式:Cookie: a=A; b=B; c=C。即多个Cookie用分号离开; l Set-Cookie:响应头,服务器端发送给客户端; ? 一个Cookie对象一个Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C 2.4 Cookie的覆盖
如果服务器端发送重复的Cookie那么会覆盖原有的Cookie,例如客户端的第一个请求服务器端发送的Cookie是:Set-Cookie: a=A;第二请求服务器端发送的是:Set-Cookie: a=AA,那么客户端只留下一个Cookie,即:a=AA。 2.5 向浏览器写cookie和获取浏览器带来的cookie
String id = UUID.randomUUID().toString();//生成一个随机字符串 Cookie cookie = new Cookie(\, id);//创建Cookie对象,指定名字和值 response.addCookie(cookie);//在响应中添加Cookie对象 response.getWriter().print(\已经给你发送了ID\); Cookie[] cs = request.getCookies();//获取请求中的Cookie if(cs != null) {//如果请求中存在Cookie for(Cookie c : cs) {//遍历所有Cookie if(c.getName().equals(\)) {//获取Cookie名字,如果Cookie名字是id response.getWriter().print(\您的ID是:\ + c.getValue());//打印Cookie值 } } }
2.6 cookie的有效时间
Cookie不只是有name和value,Cookie还是生命。所谓生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。 l cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。 l cookie.setMaxAge(60*60):表示cookie对象可存活1小时。当生命大于0时,浏览器会把Cookie保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie也会存活1小时; l cookie.setMaxAge(0):cookie生命等于0是一个特殊的值,它表示使该cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。 2.7 获取浏览器的上次访问时间
l 创建Cookie,名为lasttime,值为当前时间,添加到response中; l 在AServlet中获取请求中名为lasttime的Cookie; l 如果不存在输出“您是第一次访问本站”,如果存在输出“您上一次访问本站的时间是xxx”;
2.8 cookie中保存中文
Cookie中时无法保存中文的,如果要保存中文必须先对cookie进行url编码。 String name = URLEncoder.encode(\姓名\ String value = URLEncoder.encode(\张三\ Cookie c = new Cookie(name, value); c.setMaxAge(3600); response.addCookie(c); response.setContentType(\ Cookie[] cs = request.getCookies(); if(cs != null) { for(Cookie c : cs) { String name = URLDecoder.decode(c.getName(), \ String value = URLDecoder.decode(c.getValue(), \ String s = name + \ response.getWriter().print(s); } } ? HttpSession 3.1
HttpSession是什么
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttpSession对象中!(是一个容器,作用域对象) 3.2 获取HttpSession对象
l HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回; l HttpSession request.getSession(boolean):当参数为true时,与requeset.getSession()相同。如果参数为false,那么如果当前会话中存在session则返回,不存在返回null; 3.3 获取HttpSession对象是域对象
我们已经学习过HttpServletRequest、ServletContext,它们都是域对象,现在我们又学习了一个HttpSession,它也是域对象。它们三个是Servlet中可以使用的域对象,而JSP中可以多使用一个域对象。 l HttpServletRequest:一个请求创建一个request对象,所以在同一个请求中可以共享request,例如一个请求从AServlet转发到BServlet,那么AServlet和BServlet可以共享request域中的数据; l ServletContext:一个应用只创建一个ServletContext对象,所以在ServletContext中的数据可以在整个应用中共享,只要不启动服务器,那么ServletContext中的数据就可以共享; l HttpSession:一个会话创建一个HttpSession对象,同一会话中的多个请求中可以共享session中的数据;
下载是session的域方法: l void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:session.setAttribute(“xxx”, “XXX”),在session中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同; l Object getAttribute(String name):用来获取session中的数据,当前在获取之前需要先去存储才行,例如:String value = (String) session.getAttribute(“xxx”);,获取名为xxx的域属性; l void removeAttribute(String name):用来移除HttpSession中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做; l Enumeration getAttributeNames():获取所有域属性的名称;
3.4 Session原理
session底层是依赖Cookie! 当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。 当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。 3.5 HttpSession与浏览器
session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命不-1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。 当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId中到Cookie中发送给客户端。 你可能会说,那原来的session对象会怎样?当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,当然你也可以在自己的web.xml中覆盖这个配置!
l String getId():获取sessionId; l int getMaxInactiveInterval():获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session; l void setMaxInactiveInterval(int interval):设置session允许的最大不活动时间(秒),如果设置为1秒,那么只要session在1秒内不被使用,那么session就会被移除; l long getCreationTime():返回session的创建时间,返回值为创建时间的毫秒值; l long getLastAccessedTime():返回session的最后活动时间,返回值为当前时间的毫秒值; l void invalidate():让session失效!调用这个方法会被session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新session的sessionId; l boolean isNew():查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时session的状态为新。
正在阅读:
7、会话跟踪技术12-23
电力系统调度安全运行管理及对策 - 001-13
2013年高考物理 模拟新题精选分类解析(第6期)专题06 机械能05-22
关于在校大学生网上购物问卷调查表05-30
2011年山东文综政治07-28
关于二级助产机构自查报告104-09
有机朗肯循环实验10-03
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 会话
- 跟踪
- 技术
- 2018年中国烧烫伤用药现状分析及市场前景预测(目录) - 图文
- 7行政决策解析
- 福建省漳州市龙海二中2015届高三语文上学期期末考试试题
- 2016-2017北京各区高三二模汇编(文言文阅读)教师版
- 网络营销与传统营销方式的比较
- 水工专业毕业设计
- 宁波城市职业技术学院学生毕业综合实践任务书(方郁田)
- 中国各地南红料,哪种贵,哪种好,都给你说明白
- 第2章 水静力学
- 化工原理复习必看 - 精馏分知识点复习题
- 如何正确理解改革开放是决定当代中国命运的关键抉择
- 《天净沙秋思》《散文诗两首》4
- 立足现实,搞好地理教学
- 铁道部认证的64家外加剂企业合格供应商名录
- 螺栓及螺母最大扭矩推荐值
- 班主任学习材料(一)
- 徐州市2009-2010学年度高三第三次调研考试 化学
- 数学日记的作用
- 汇编实验
- 数据库系统概论期末试题及答案(整理版)