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中覆盖这个配置! 30 3.5 Session中其他api

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的状态为新。

本文来源:https://www.bwwdw.com/article/6z65.html

Top