版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第16HTTP是一个无状态协议,即不能先前的连接,也不能把某个客户端的请求与另一个客户端区别开来。无状态协议在很多方面优于状态协议,但是它也引出一些重大技术上的。值得庆幸的是,有几种方法可以有效地把状态信息添加到HTTP协议中。章将分其中几方法,时介绍个于会话状的ServetAP。从传统意义上讲,会话是进行信息交互的两台主机(通常是一台客户端和一台服务器)HTTP话(或者叫做虚拟会话,这类会话涉及到的连接是虚拟连接,而不是物理连接。在HTTP事务处理中,客户段与服务器的连接非常简单:客户端先建立同服务器的接,然后发送请求,接受响应,之后断开连接。因为在两次请求间隔的时间里不能保证客户端与服务器的持续连接,所以一旦连接断开,服务器与客户端的连接也就结束了。如果同一个客户端又发送了新请求,服务器并不能把这次的连接同此客户端的前一次连接联系起来,服务器在断开连接之后就忘记了那个曾与它连接的客户是HTTP协议所的重大。导致的问题如下:如果服务器需要对客户进行验证,那么,客户端的每次请求都必须重新进行验证。由于服务器不能将一个客户与另一个客户区分开来,所以就不能特定用户的信息,例如购物车中的已选物品。幸运的是,这些问题可以通过在客户端和服务器段建立一个虚拟连接来解决。虚拟连接把服务器收到的每个请求同发送该请求的客户端联系起来,这种联系可以通过(通ID作HTTP(简称会话信和客户的标识。HTTP会话通过共个会话ID而把所有客户请求联系起来。传统会话涉及打开网络连接的持续时间;与此类似,HTTP会话涉及的是虚拟连接的持续时间。简而言之,HTTP会话是一系列相关的请求,从这些请求中可以唯一标识出客户端,HTTP客户端和HHTTP服务器之间的这种联系,可以在特定的时间内,在多个请求和连接中得以HTTP络断开的情况,所以可以采用下面方法来中止会话:在服务器上配置HTTP会话的持101515分钟,服务器就中止与这个客户端的服务器中止会话意味着把用来唯一标识客户端的会话ID连同相关的数据(例如购物车中的商品)从器中删除了。会话ID通常存放在内存或者数据库中,一旦会话ID中止并被从器中删除了,那么最初使用这个会话ID的客户端为了分配到一为了更好的了解什么是会话,我们来看HTTP会话生命周期的一系列(注意,:客户的中,并随每次请求被发送。这是HTTP会话的开始。ID,服务(7)15ID 器和客户端之间传递会话ID。有几种方法可以方便客户端与服务器端会话ID与状态信息的交换,下面将讨论会话信息在URL路径当把状态添加到像HTTP这种无状态协议中的时候,每种技术都有一个共同点:状态支持机制必须允许服务器将状态到客户端,这条信息会随请求一起被返回到服务器。这种管理URL路径的方法是通过把会话ID(或其它状态信息)嵌于URL路径中,从而完成这种双向通信。客户端请求位于/login.html的文档。屏幕出现一服务器接受到了有效的用户名和后会生成一个唯一的会话ID,如12345,随即将客户重定向到页面:/sess URLID。如果不存在会话ID或者会话ID无效,客户将被重定向到第一步描述的登录界面。从这点之前,超中的URL和返回到客户端的所有文档中的<form>标记使用的都只是相对URL。浏览器的是协议、主机和从最近使用的绝对URL请求URL之后,每个后续的相对URL请求都使用同样的协主机和路径信息。注意浏览器的这一行为是如何有效地将客户端的会话ID随每次的每一次客户端发出请求,在站点的相对URL后面,浏览器将完整的路径信息(包括会话ID)返回给服务器。服务器使用这条会话信息识别客户、加强安全策略 当然 像可以把所有状态信息添加到HTTP一样,使用这个技术可以把会话信息放到URL路径中。它的优点在于不需要特别的浏览器功能,这种方法适用于所有浏览器,包括那些不支持的浏览器。当然它也有自身的缺点:首先,要求只使用整个站URLIDURL,那ID在浏览器的地址域中可见。如果有另外一个用户看到地址域中可见 当然 最后,服务器处理包含着会话信息的URL可能更难一些。不但要分析每个请求,还要返回适当的资源。而使用的时候就不需要分析URL,而且使用时,可以利用ServletAPI把URL中的虚拟路径轻松转化为物理路径。在Web上管理会话的另一个常见方法是使用重写的URL。重写的URL通过把信息嵌入到所有超URL中或者嵌入到HTML文档的<form>标记中,在服务器和客户端之间传送状态信息。信息可以以“名/值”对的形式,在URL的查询字符串中被传送,每一对用“&”符号分开。例如,在浏览器地址域中输入下面URL,就会把查询标准传送到WebCrawler搜索引擎上: /cgi- URL中的“?”后面。查询字符串中的所有“名/值”对作为Web变量被传送到服务器。使用ServletAPI中,HttpServletRequest对象的getParameter()方法或者getParameterValues()方法可以这些变量。下面具体分析一下如何用这种行为在客户端和服务器间传送状态信息。这里有<metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<a<a<a<a<a注意,每个超都请求同样的资源“oorServet”但个超传不同的颜色值。为了所指定的背景色以便满足客户将来的请求,这条信息必须在客户端与服务器之间随每次的请求和相应被传送。<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<body<a<a <a <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<body<a<a <a Servlet/search.html?bcolor=blue">站内搜索</html>这里服务器把查询字符串“bcolor=green”添加到文档的每个超的URL息,返回用户的响应一定是绿色背景的。如图16-1所示:图16-1超保存用户状态信FORMAction上面我们讲解了如何重写超中的URL来传递用户状态信息,下面我们介绍另法——通过FORM表单的Action属性传递用户信息。<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<body<formmethod="post"<inputtype="submit"<inputtype="submit"<inputtype="submit"<inputtype="submit"<inputtype="submit"item"value="产item"value="企业信息item"item"value="职工信息item"value="站内搜索16-2FORMaction属性保存客户状态信FORM<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<title>What'syour<body<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<title>What'syour<body<formmethod="post"<inputtype="text"name="name"size=<inputtype="hidden"name="bcolor"<inputtype="submit"value="提交16-316-3隐藏域保存用户状态信<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<body<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN" <metahttp-equiv="Content-Type"content="text/html;charset=gb2312"<bodyServlet/catalog.html?sessionID=12345">产 Servlet/info.html?sessionID=12345">企业信息<formmethod="post" <inputtype="submit" item"value="职工信息<inputtype="submit" item"value="站内搜索图图16-4使用 和FORM表单保存会话提供了在客户端状态信息的最简单方法。使用管理状态和会话服务器创建一个保存到客户端,其中了背景颜色信息。这条服务器构造HTML文档,并按中背景颜色信息设置其背景色,返回可见,使用管理会话状态非常简单,同样只要把背景色换成会话ID就可使用管理会话有很多优点:首先,是在客户端状态信息最简单的方法,因为只一次,不像重写URL那样,服务器要不断地将用户信息返回给客户端。其次,比把会话ID到URL路径中的方法安全许多。最后,不需要分析请求的URLHTMLServletAPI除了以上优点,还有一个明显的缺点:并不是所有的浏览器都支持。以,在编写代码的时候,一定要考虑到用户情况,不能轻易使用。会话状态 面将研究如何让使用AServletAPI管理会话。ServletAPIHttpSession接口,HttpSession对象封装了HTTP会话的重要信息,比如唯一的会话ID以及其它的客户信息。获得HttpSession对象,可以用HttpServletRequest对象的getSession()方法。publicpublicHttpSessionpublicHttpSessiongetSession(boolean该方法返回一当前有效会话的HttpSession对象。如果请求与有效会话无回null。除了可以使用HttpServletRequest对象的getSession方法获取会话对象外,HttpServletRequest还提供了一些方法,用于获取会话对象的一些相关信息,如下:getRequestedSessionId()IDString类型的对象。如果请求会话的ID无效,则创建一个新的会话,并返回新的会话ID,如果请求与会话无关,返回null。isRequestedSessionIdFrom():该方法返回一个boolean值,该值表明是否isRequestedSessionIdFromURL()boolean值,该值表明会话IDURLURLtrue;否则,返回false。isRequestedSessionIdValid()boolean值,该值表明请求的会IDIDID有效,返回true;否则,返回false。packageservletdemo;importjava.io.*;importjavax.servlet.*;importpublicclassSessionInfoServletextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throws默认情况下,ServletAPI中的会话管理机制使用,该名为JSESSIONIDServletAPI中有方法可以用来确认packageservletdemo;importjava.io.*;importjavax.servlet.*;importpublicclassSessionInfoServletextendspublicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsHttpSessionmySession=request.getSession(true);HttpSessionmySession=request.getSession(true);PrintWriterout=response.getWriter();out.println("<br>会话ID:"+mySession.getId());out.println("<br>会话创建时间:"+newjava.util.Date(mySession.getCreationTime())); out.println("<br>out.println("<br>会话ID由 out.println("<br>会话ID由URL返回:"+request.isRequestedSessionIdFromURL());out.println("<br>会话ID是否有效:"+request.isRequestedSessionIdValid());}publicStringreturn"Servletreturnssession}}<servlet-name>Session</servlet-<servlet-class>servletdemo.SessionInfoServlet</servlet-<servlet- <servlet-name>Session</servlet-<servlet-name>Session</servlet-<servlet-class>servletdemo.SessionInfoServlet</servlet-<servlet- <servlet-name>Session</servlet-</servlet- 息如图16-5所示:16-5第一次请求的会16-616-6第二次请求的会16-516-6可以看出,第一次向服务器发出请求时,建立了一个新的会LastAccesedie值是一样的,因为第一次请求时,它的前一次请求就是它本身,而第二次请求时,他的前一次请求也是16-5SessionInfoFromequetrequest对象对性的就是刚刚建立的会话了,所以这一节,围绕HttpSession接口讲解它的API,为了让读者思路清晰,这里用到的获取会话相关信息的方法和HttpSession接口的一些其它有用方法。getId()String类型的对象,该对象包含用于唯一的标识该会话的会话ID。自1970-1-1到该会话被创建之间经历的毫秒数。的时间,数值含义与getCreationTime()相同。servlet容器可能会中止会话,对于从不中止的会话(即有效期为无穷大getMaxnactvenerva():该方法用来设置会话在服务器没有再次收到客户端请求之前可以确保有效的最长时间(秒数。最大待用间隔用完后,servet容器可能会中止会话。isNew():该方法返回一个boolean值,表示该会话是否为新的,即该会话刚invalidate()HTTPsetAttribute()publicvoidsetAttribute(Stringname,Object publicObjectgetAttribute(String 该方法返回绑定到指定名称的会话对象;如果指定名称不存在,返回nullgetAtttributeNames(),语法格式如下 publicjava.util.Enumeration removeAttribute()方法,语法格式如下 publicvoidremoveAttribute(Stringname) packageservletdemo;importjava.io.*;importpackageservletdemo;importjava.io.*;importjavax.servlet.*;importpublicclassColorSessionServletextendspublicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsStringname;Stringcolor;HttpSessionmySession=request.getSession(true);PrintWriterout=response.getWriter();out.println("<formmethod=\"post\"action=\"ColorSession\">");out.println("<inputtype=\"radio\"name=\"bcolor\"valueout.println("<inputtype=\"radio\"name=\"bcolor\"valueout.println("<inputtype=\"radio\"name=\"bcolor\"value=\"red\">red<br>");out.println("<inputtype=\"radio\"name=\"bcolor\"value=\"blue\">blue<br>");out.println("<inputtype=\"radio\"name=\"bcolor\"value=out.println("<inputtype=\"textnamenamesize20\"><br>");out.println("<inputtype=\"submit\"value=\"提交\">");}Stringbcolor=request.getParameter("bcolor");if(bcolor.equals("black"))color="000000";elseif(bcolor.equals("red"))color="ff0000";elseif(bcolor.equals("blue"))color="0000ff";elsecolor=name=request.getParameter("name");hitCount=newInteger(1);name=request.getParameter("name");hitCount=newInteger(1);}color=(String)mySession.getAttribute("bcolor");name=(String)mySession.getAttribute("name");}mySession.setAttribute("hitCount",newInteger(hitCValue()+1));out.println("<html><head><title>已选择颜色</title></head><bodybgcolor="+color 该网页"+hitCount+"次!</h3><br>");out.println("<ahref=\"ColorSession\">重新载入该页</a>");}}publicStringreturn"Servletusessessionmanagementtomaitaincolorand}}<servlet-name>ColorSession</servlet-<servlet-class>servletdemo.ColorSessionServlet</servlet-<servlet-<servlet-name>ColorSession</servlet-<servlet-class>servletdemo.ColorSessionServlet</servlet-<servlet- <servlet-name>ColorSession</servlet-<url-pattern>/ColorSession</url-</servlet- servlet开始先根据会话是否新建的,判断用户是否第一次登录该站点,如果是HTML文档。如图16-7所示:16-7让用户选择背景颜色和输入名字如果不是第一次登录,那么就要获取背景颜色和用户输入的名字,这时要再次做出判断,如果该请求是用户提交表单的请求,则获取表单信息,并将其到会话对象中,页面显示第一次请求该网页(168所示;否则从会话对象中获取会话信X次请求该页面。16-8用户提交表单并第一次请求ServetAPI提供方法在对象被添加到会话或被从后会话中删除时,通知该对象,以便于该对象完成初始化动作(添加该对象时)或者是释放占有的资源(删除该对象时。publicvoidvalueBound(HttpSessionBindingEventevent)publicvoidvalueUnbound(HttpSessionBindingEventevent)一个对象可以通过实现javax.servlet.http.HttpSessionBindingListener接口的方法,在它被添加到会话或从会话中被删除时,得到HttpSession对象。HttpSessionHttpSessionBindingListenervalueBound()valueUnbound()方法,法,当把对象从会话中删除时,调用valueUnbound()方法。这两个方法都接收HttpSessionBindingEvent对象,它里面包含着有关的信息,publicvoidvalueBound(HttpSessionBindingEventevent)publicvoidvalueUnbound(HttpSessionBindingEventevent)当会话终止或无效时,会在所有对象上调用valueUnbound()方法。HttpSessionBindingEvent对象实现了两个方法,它们用来传递和绑定有关的packageservletdemo;importjava.io.*;importjavax.servlet.*;importpublicclassSessionBindingServletextendspublicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsHttpSessionmySession=request.getSession(true);PrintWriterout=response.getWriter();StringsessionObjectNamepackageservletdemo;importjava.io.*;importjavax.servlet.*;importpublicclassSessionBindingServletextendspublicvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)throwsHttpSessionmySession=request.getSession(true);PrintWriterout=response.getWriter();StringsessionObjectName=request.getParameter("Name");if(sessionObjectName==null){sessionObjectName=}out.println("<html><head><
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年河南省巩义市高三生物下册期末考试模拟卷含答案
- 2026中国专利代理行业市场深度调研及行业投资策略与行业市场竞争分析报告
- 2026中国工业大数据分析平台功能演进与用户需求调研报告
- CN119491101A 一种基于复配碱沉淀剂的mhp沉淀方法及其应用 (格林美香港国际物流有限公司)
- 2026年江苏省邳州市高一历史上册期末考试测试卷(巩固)附答案
- 2026国际注册内部审计师(CIA)资格考试(内部审计基础)历年参考题库含答案详解
- 2026四川省机关事业单位工人技术等级考试(电气值班员·高级)历年参考题库含答案详解
- 2026四川机关事业单位工人技术等级考试(电焊工·初级)历年参考题库含答案详解
- 2026吉林省委党校在职研究生招生考试(公共管理综合)历年参考题库含答案详解
- 2026吉林机关事业单位工人技术等级考试(花卉工·中级)历年参考题库含答案详解
- 2026年四川省商业投资集团有限责任公司人员招聘笔试参考试题及答案详解
- 2026年绍兴市原水集团有限公司人员招聘笔试参考试题及答案详解
- 医院项目社会稳定风险评估报告
- 第八版内科冠心病课件讲课教案
- 自考03450公共部门人力资源管理 重点精简版
- 2026四川省党政领导干部政治理论水平综合能力测试题及答案
- 智联国企行测笔试真题
- 裁床加工服务合同
- 孕产及哺乳期乳房护理课件
- 社会工作专业英语 课件 chapter 2 Social Work Theories
- Soul《心灵奇旅(2020)》完整中英文对照剧本
评论
0/150
提交评论