常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

  Http协议是一种无状态的协议,一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接,这就意味着服务器无法从连接上跟踪会话,可以使用Cookie和Session来跟踪会话。

  Cookie

  Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。

  Cookie的功能需要浏览器的支持。如果浏览器不支持(如大部分的手机浏览器)或者把Cookie禁用了,Cookie功能就会失效。

  Cookie封装成了javax.servlet.http.Cookie类。可以通过request.getCookie()获取到所有Cookie的一个数组。

  Cookie中只能存ASCII字符,所以对中文,二进制数据等要进行处理,对于中文,可以使用java.net.URLEncoder类的encode(String str, String encoding)方法进行编码,使用java.net.URLDecoder类的decode(String str, String encoding)方法进行解码;对于二进制数据如图片,可以使用BASE64编解码。BASE64Encoder.class.newInstance().encode(byte[]), BASE64Decoder.class.newInstance().decodeBuffer(String)

  Cookie的属性

  对应的有get,set方法

  name名, value值, maxAge失效时间, secure是否仅被安全协议传输, path可以访问的路径, domain呆以访问的域名, comment用处说明, version使用的版本。

  Cookie的有效期

  Cookie的maxAge决定着Cookie的有效期,单位为秒。通过getMaxAge()与setMaxAge(int)来读写maxAge属性。

  如果maxAge为正数,则Cookie将在maxAge秒之后失效,如下面的例子Cookie将永远有效。

  cookie.setMaxAge(Integer.MAX_VALUE);

  如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因为关闭浏览器该Cookie就消失了。Cookie默认的maxAge为-1。

  如果maxAge为0,则表示删除该Cookie。是采用失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。

  response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。

  Cookie的域名

  Cookie是不可跨域名的。但可以通过设置domain属性使一组域名可以共享同一个Cookie。如下面的例子:

  cookie.setDomain(".helloweenvsfei.com");

  domain参数必须以点(".")开始。

  Cookie的路径

  domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径,粒度比domain要细。

  Cookie的安全属性

  HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议转输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:

  cookie.setSecure(true);

  但请注意secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。

  JAVASCRIPT操作Cookie

  Cookie是保存在浏览器端的,因此浏览器具有操作Cookie的先决条件。浏览器可以使用脚本程序如JavaScript或者VBScript等操作Cookie。

  document.cookie获取Cookie字符串

  具体获取某个Cookie的方法请自行通过网络获取,JavaScript中并没有专门处理Cookie的API。

  Session

  Session是服务端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。

  什么是Session

  Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

  如果说Cookie机制是通过检查客户身上的“通行证“来确定客户身份的话,那么Session机制就是通过检查服务器上的”客户明细表“来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案就可以了。

  Session对应的类为javax.servlet.http.HttpSession。每个来访者对应一个Session对象,所有该对象的状态信息都保存在这个Session里。Session是在客户端第一次请求服务器的时候创建的。设置,获取的方法为setAttribute(String, String),getAttribute(String),通过request.getSession()方法获取该客户的Session,还有一个重载方法request.getSession(boolean),如果为true,当session不存在时,该方法会先创建Session再将Session返回,而getSession()在不存在Session时会返回null。

  Session与Cookie的一个重要区别是Cookie只能保存字符串,而Session可以保存一切对象,类,基本类型等。

  Session的生命周期

  Session保存在服务器端。一般在内存中,所以当Session过多,内容过于复杂时,会对服务器造成很大的压力。Session在用户第一次访问服务器的时候自动创建,这里只有访问JSP、Servlet等程序时才会创建Session,访问HTML、IMAGE等静态资源并不会创建Session。Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session。用户每访问一次服务器,无论是否读写Session,服务器都认为该用户的Session”活跃“了一次。

  Session的有效期

  Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(long)修改。Session的超时时间也可以在web.xml中修改,具体方法自行找相关资料。另外,通过调用invalidate()方法可以使Session失效。

  Session的常用方法

  setAttribute(String, Object)

  getAttribute(String)

  getAttributeNames()

  removeAttribute(String)

  getId()

  getCreationTime()

  getLastAccessedTime()

  getMaxInactiveInterval()

  setMaxInactiveInterval(int)

  putValue(String, Object)

  getValue(String)

  isNew()

  invalidate()

  Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int)修改超时间间。

  Session对浏览器的要求

  服务器会向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id,Session依据该Cookie来识别是否为同一用户。如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?答案是URL地址重写。

  URL地址重写

  原理是将该用户的Session的id重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(String),encodeRedirectURL(String)实现URL地址重写。

  Session中禁止使用Cookie

  在WebRoot目录下的META-INF文件夹下创建context.xml,内容如下:

  <?xml version='1.0' encoding='UTF-8' ?>

  <Context path="/sessionWeb" cookies="false">

  </Context>

  或者修改Tomcat全局的conf/context.xml,修改内容如下:

  <Context cookies="false">

   ...

  </Context>

  这样TOMCAT便不会自动生成名JSESSIONID的Cookie,Session也不坐以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了。

  注意该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写。也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie。

  Session与Cookie的比较

  1. 存取方式

  Cookie:ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8,GBK或者BASE64编码。

  Session:可以存取任何类型的数据,可以把Session看做是一个Java容器类。

  2. 隐私安全

  Cookie:存储在客户端,不安全,如果使用Cookie,敏感信息如账号密码等尽量不要写到Cookie中,Cookie中的信息进行加密,到服务器后再进行解密。

  Session:存储在服务器,安全。

  3. 有效期

  Cookie:可以长久记录信息,只要把maxAge设置成一个很大的数。

  Session:不利于长久记录信息,因为Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的maxAge默认为-1,只要关闭了浏览器该Session就会失效,因此Session不能实现信息长久有效的效果。使用URL地址重写也不能实现。而且如果设置Session的超时时间过长,服务器累计的Session就会越多,越容易导致内存溢出。

  4. 服务器负担

  Cookie:保存在客户端浏览器,不占用服务器资源。

  Session:保存在服务器端,如果并发访问的用户非常多,会产生非常多的Session,消耗大量的内存。

  5. 浏览器支持

  Cookie:需要客户端浏览器的支持,如果被禁用或是不支持,就无法使用,而对于WAP应用,常规的Cookie就不支持。如果浏览器支持Cookie,既可以设为本浏览器窗口以及子窗口内有效(maxAge=-1),也可以设为所有浏览器窗口内有效(maxAge设为某个大于0的整数)。

  Session:只能在本窗口及子窗口内有效。如果两个浏览器窗口互不相干,它们将使用两个不同的Session。

  6. 跨域名

  Cookie:通过设置domain属性来支持跨域名。

  Session:不能跨域名。

  小结

  Cookie是早期的会话跟踪技术,它将信息保存到客户端浏览器中。浏览器访问网站时会携带这些Cookie信息,达到鉴别身份的目的。

  Session是在Cookie基础上建立的会话跟踪技术,它将信息保存在服务器端,Session中能够存储不同的JAVA对象,因此使用更加方便。Session依赖于名为JSESSIONID的Cookie.

  如果客户端浏览器不支持Cookie,或者禁用了Cookie,仍然可以通过使用URL地址重写来使用Session。

JAVA WEB开发中的会话跟踪的更多相关文章

  1. 下面哪项技术可以用在WEB开发中实现会话跟踪实现?

    下面哪项技术可以用在WEB开发中实现会话跟踪实现? A:session B:Cookie C:地址重写 D:隐藏域 答案:ABCD 会话跟踪是一种灵活.轻便的机制,它使Web上的状态编程变为可能. H ...

  2. 哪项技术可以用在WEB开发中实现会话跟踪实现?

    HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息.即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连 ...

  3. 介绍web开发中实现会话跟踪的常用技术方法

    由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...

  4. Java Web开发中路径问题小结

     Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...

  5. Java Web 开发中路径相关问题小结

    Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...

  6. Java Web开发中MVC设计模式简介

    一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...

  7. java web开发中常用的协议的使用和java-web 常见的缓冲技术

    一.DNS协议 作用将域名解析为IP   类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...

  8. Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)

    看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...

  9. Java Web开发中的名词解释

    1.JVM Java虚拟机,class文件的运行时环境,就好比软件运行在操作系统一样,java要运行在JVM中才行,这也是Java之所以支持扩平台的基础. 2.Servlet/JSP 是满足一定接口需 ...

随机推荐

  1. Nginx 下部署 HTTPS 与安全调优

    什么是 HTTPS?# HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的 ...

  2. jquery禁止复制、禁用右键、文本选择功能、复制按键

    本文章介绍的jquery禁用右键.文本选择功能.复制按键的实现它可以兼容浏览器有IE.firefox.谷歌浏览器,各位朋友可参考.IE浏览器是指以IE为核心的浏览器也支持,有360,QQ等 代码如下: ...

  3. 两数之和 Two Sum

    给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 n ...

  4. ML(3.2): NavieBayes R_kalR

    ML3.1 介绍e1071包实施朴素贝叶斯分类的函数,本例使用klaR包中的NaiveBayes函数,因为该函数较之前者增加了两个功能,一个是可以输入先验概率,另一个是在正态分布基础上增加了核平滑密度 ...

  5. 知识点查缺补漏贴01-进程间通讯之mmap文件共享

    引文: 个人名言:“同一条河里淹死两次的人,是傻子,淹死三次及三次以上的人是超人”.经历过上次悲催的面试,决定沉下心来,好好的补充一下基础知识点.本文是这一系列第一篇:进程间通讯之mmap. 一.概念 ...

  6. 术语-软件-软件开发:SDK(软件开发工具包)

    ylbtech-术语-软件-软件开发:SDK(软件开发工具包) 软件开发工具包(缩写:SDK.外语全称:Software Development Kit)一般都是一些软件工程师为特定的软件包.软件框架 ...

  7. COMMON INTERVIEW QUESTIONS

    1. What do you see yourself doing five years from now? 2. What motivates you to put forth your great ...

  8. LVM逻辑卷创建管理

    首先添加三块硬盘 结构关系图 相关命令 查看磁盘 #fdisk -l 分区 #fdisk /dev/sda/ #n新建 ProMary主分区 extended扩展分区 #p查看 #q不保存退出 #w保 ...

  9. oracle 用函数返回对象集合

    1.先要声明全局type:并且,字段变量类型要为object,不能为record: (1)CREATE OR REPLACE TYPE "DDD_BY_DEPT_STATISTISC&quo ...

  10. 关于javascript的cookie的封装

    /******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...