第2章 Session管理

Session管理(或Session追踪)是Web应用程序开发中一个非常重要的主题。这是因为Web语言HTTP是无状态的。在默认情况下,Web服务器不知道一个HTTP请求是来自初次用户,还是来自之前已经访问过的用户。
例如,webmail应用程序要求其用户在查看邮件之前要先登录。但是,一旦用户输入正确的用户名和密码,用户在访问应用程序的其他部分时,就不应该再次提示他们登录。应用程序需要记住哪些用户已经登录成功。换句话说,它必须能够管理用户Session。
本章讲解可以用于保持状态的4种方法:网址重写(URL rewriting)、隐藏域、cookie及HttpSession对象。本章展示的范例都是app02a应用程序中的内容。

2.1 网址重写

网址重写是一种Session追踪技术,需要将一个或多个token作为一个查询字符串添加到一个URL中。token的格式一般是键=值:

注意,URL和token之间要用一个问号(?)隔开,两个token之间则是用一个&符号隔开。
如果token不必在过多的URL中四处携带,那么网址重写就比较合适。采用网址重写的缺点如下:
在有些Web浏览器中,URL限制为2000个字符。
仅当有链接要插入值时,值才能转换成后面的资源。此外,要把值添加到静态页面的链接中,可不是一件容易的事情。
网址重写必须在服务器端有效。所有的链接都必须带有值,这样可能出现一个问题,即一个页面中可能会有许多个链接。
某些字符,例如空格、&符号及问号都必须进行编码。
添加到URL中的信息是明显可见的,这种情况有时可不是我们所期待的。
由于上述局限性,网址重写只适用于那些既需要保持,却又不跨越太多页面,并且又不太重要的信息。
举个例子,代码清单2-1中的Top10Servlet类是一个Servlet,它展示了伦敦和巴黎这两座城市中十大最受人喜爱的旅游胜地。信息分两页显示。第一页显示所选城市中前五大最受人喜爱的旅游胜地,第二个显示接下来的五个。Servlet利用网址重写追踪被选城市和页码。它继承HttpServlet,并利用/top10 URL模式调用。




当第一个用户请求Servlet时,调用init方法,并填充两个类级List:londonAttractions和parisAttractions,它们每一个都包含十个旅游胜地。
每一次请求都会调用doGet方法,查看URL是否包含请求参数city,以及它的值是否为“london”或者“paris”。方法会根据这个参数的值调用showAttractions或者showMainPage。

最初,用户会不带请求参数调用Servlet,并且还会调用showMainPage。这是一个简单的方法,它给浏览器发送了两个超链接,每个链接中都嵌有一个token:city=cityName。用户会看到如图2-1所示的屏幕。现在,用户可以选择其中一个城市了。
如果你打开页面源代码,就会看到主体标签中有以下HTML标签:

最值得关注的是a标签的href属性值,它包含一个问号,接着是token:city=london或者city=paris。任何相对的URL(没有协议部分的URL)都会被当作是相对于当前页面的URL。换句话说,如果单击了页面中的某一个超链接,那么:

就会被发送到服务器。
一旦用户单击其中一个超链接,doGet方法就会找到请求参数city,并将控制权传给showAttractions方法,然后查看URL,看它里面是否包含请求参数page。如果没有请求参数page,或者它的值不能转换成数字,就会假设这个值为1,该方法就会发送被选中城市的前五个旅游胜地。图2-2展示了选中伦敦时的情况。
除了城市中的旅游胜地之外,showAttractions还会发送三个超链接:Select City、Page 1及Page 2。Select City会调用没有请求参数的Servlet。Page 1和Page 2包含两个token:city和page。

如果选择了伦敦,并单击Page 2,它就会将这个URL发送到服务器,并在后面添加两个键/值token:

这时就会看到伦敦前十大旅游胜地的后五个,如图2-3所示。

这个范例展示了如何利用网址重写来嵌入一个城市,以便服务器知道要在第二页中显示什么内容。

《Servlet和JSP学习指南》一第2章 Session管理 2.1 网址重写相关推荐

  1. 《Servlet和JSP学习指南》一2.5 小结

    2.5 小结 本章学习了Session管理和4种Session管理技术.网址重写和隐藏域主要针对"轻量化"的Session追踪技术,它适用于不需要跨越许多页面的信息.另两种技术:c ...

  2. 《Servlet和JSP学习指南》一导读

    前 言 欢迎你阅读本书,其内容涵盖了Servlet 3.0和JSP 2.2方面的技术. Java Servlet技术,或简称Servlet,是Java中用于开发Web应用程序的基本技术.Sun公司于1 ...

  3. 《Servlet和JSP学习指南》一第1章 Servlet 1.1 Servlet API概述

    第1章 Servlet Servlet是开发Servlets应用程序的主要技术.掌握Servlet API是成为一名技术高超的Java Web开发者的基础.你必须非常熟悉Servlet API中所定义 ...

  4. java jsp学习指南_JSP教程–最终指南

    java jsp学习指南 编者注: JavaServer Pages(JSP)技术使您可以轻松创建同时包含静态和动态组件的Web内容. JSP技术提供了Java Servlet技术的所有动态功能,但提 ...

  5. PMBOK(第六版) 学习笔记 ——《第六章 项目进度管理》

    系列文章目录 PMBOK(第六版) 学习笔记 --<第一章 引论> PMBOK(第六版) 学习笔记 --<第二章 项目运行环境> PMBOK(第六版) 学习笔记 --<第 ...

  6. 【Servlet】JSP学习-概念和运行原理

    为什么需要JSP? 与HTML相比:根据后台的业务,可以动态输出HTML,网页内容是可以改变的. 与原生Servlet相比:不需要自己写输出语句resp.getWriter().write(" ...

  7. Head first servlet and jsp学习笔记

    学习中遇到的问题:java基础不行,都忘光了. 主要是:继承,接口,多线程,IO.尤其是多线程,在分布式系统中应该使用的比较多 第一章:前言和体系结构 HTTP协议: TCP/IP的上层协议(应用层) ...

  8. servlet和jsp学习总结

    一.servletConfig部分 作用: ServletConfig 对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,用来获取web.xml中的配 ...

  9. Servlet和JSP学习指导与实践(二):Session追踪

    前言: web应用中经常需要对某些有用的信息进行存储或者附加一些信息.本文主要介绍session,即"会话"跟踪的几种不同方式~ ------------------------- ...

最新文章

  1. 彩色图像到灰度转换 常见方法汇总与对比
  2. 【CVPR 2018】腾讯AI lab提出深度人脸识别中的大间隔余弦损失
  3. 音频降噪在58直播中的研究与实现
  4. 【C 语言】指针数据类型 ( 指针类型变量 与 指针指向的内存块 概念区别 | 指针赋值 | 指针运算 | 内存赋值 | 内存取值 | 内存修改注意事项 )
  5. c语言用户输入编程,C语言入门教程-Printf:读取用户输入
  6. 数据仓库--主题和主题域
  7. [leetcode]344.反转字符串
  8. 20220208--CTF刷题记录--6道简单的MISC题目
  9. CSS中!important的使用
  10. js eval()函数
  11. 学习的回顾--数组的有关内容
  12. 浅析libcurl多线程安全问题
  13. nvme装系统不能自引导_新买的固态硬盘用AHCI不能装系统,而用IDE却可以?问题就在这里...
  14. windows开启远程桌面
  15. 深度学习的黑魔法防御术:恶意样本(Adversarial Example) 的防御策略综述
  16. iphone自适应屏幕亮度_如何降低iPhone的亮度低于iOS允许的亮度
  17. 初学盲打,免费,免安装,高颜值的在线打字练习网站
  18. 使用函数输出指定范围内的Fibonacci数
  19. 推荐系统(3):倒排索引在召回中的应用
  20. 清华大学网上课程面向全国免费开放!无需登录、注册!在家上清华!

热门文章

  1. 中国工程院发布2021中国电子信息工程科技发展十四大趋势
  2. 德国颁发抄袭大奖,中国包揽前10名拿了大满贯!
  3. 一文剖析2020年最火十大物联网应用|IoT Analytics 年度重磅报告出炉!
  4. Neuron:迄今为止最大的颗粒细胞数据,发现海马齿状回神经元可过滤并放大空间信息...
  5. 论强化学习的根本缺陷
  6. 英伟达的雄心:成为AI时代的计算平台
  7. 55 岁中国芯片首富,捐出 200 亿:建一所理工大学
  8. 终于实现“代码恒久远,Bug 永流传”,你今天被官宣了吗? | 每日趣闻
  9. 如何自己写一个公用的NPM包
  10. 使用websocket-sharp来创建c#版本的websocket服务