JAVA WEB开发中的会话跟踪
常用的会话跟踪技术是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开发中的会话跟踪的更多相关文章
- 下面哪项技术可以用在WEB开发中实现会话跟踪实现?
下面哪项技术可以用在WEB开发中实现会话跟踪实现? A:session B:Cookie C:地址重写 D:隐藏域 答案:ABCD 会话跟踪是一种灵活.轻便的机制,它使Web上的状态编程变为可能. H ...
- 哪项技术可以用在WEB开发中实现会话跟踪实现?
HTTP是“无状态”协议:客户程序每次读取 Web 页面,都打开到 Web 服务器的单独的连接,并且,服务器也不自动维护客户的上下文信息.即使那些支持持续性 HTTP 连接的服务器,尽管多个客户请求连 ...
- 介绍web开发中实现会话跟踪的常用技术方法
由于http是无状态的协议,这种特性严重阻碍了客户端与服务器进行动态交互,例如购物车程序,客户在购物车中添加了商品,服务器如何知道购物车已有的物品呢?为了支持客户端与服务器之间的交互,为了弥补http ...
- Java Web开发中路径问题小结
Java Web开发中,路径问题是个挺麻烦的问题,本文小结了几个常见的路径问题,希望能对各位读者有所帮助. (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 ...
- Java Web 开发中路径相关问题小结
Java Web开发中路径问题小结 (1) Web开发中路径的几个基本概念 假设在浏览器中访问了如下的页面,如图1所示: 图1 Eclipse中目录结构如图2所示: 图2 那么针对这个站点的几个基本概 ...
- Java Web开发中MVC设计模式简介
一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条 ...
- java web开发中常用的协议的使用和java-web 常见的缓冲技术
一.DNS协议 作用将域名解析为IP 类似于我们只需要知道中央一台,中央二台,而不需要知道它的频率,方便记忆. java dns 域名解析协议实现 1 域名解析,将域名可转换为ip地址InetAd ...
- Java Web开发中路径问题小结(getRequestUrl getContextUrl getServletUrl)
看以博客感觉不错,分享一下http://www.cnblogs.com/tianguook/archive/2012/08/31/2665755.html (1) Web开发中路径的几个基本概念 假设 ...
- Java Web开发中的名词解释
1.JVM Java虚拟机,class文件的运行时环境,就好比软件运行在操作系统一样,java要运行在JVM中才行,这也是Java之所以支持扩平台的基础. 2.Servlet/JSP 是满足一定接口需 ...
随机推荐
- 函数对象(functional)
来自STL中的概念:如果f是一个function object,则可以将operator()作用于f身上. 调用函数对象时构造函数和operator()执行顺序 首先执行构造函数,构造出一个匿名对象 ...
- 【转】linux下终端命令快捷键
原文网址:http://daaoao.blog.51cto.com/2329117/554177 linux下使用终端不可避免. 使用终端快捷键,当然会使你如虎添翼.记住他们吧 终端快捷键 tab=补 ...
- windows dos窗口下如何复制和粘贴
这个帖子纯属为自己之前一些笨笨的操作做一次终结.使用计算机也有六年多了,很多计算机的基本操作也都掌握了,但毕竟是泥腿子出身,很多windows下的快捷操作和优化部分依然是不懂,就知道以窗口为基准,使用 ...
- PHP接收表单(GET/POST)时,表单名中的点变成了下划线怎么办?
如果开发中发现,从表单中传递上来的表单名称后端接不到值,不要惊慌,很有可能是表单名称中带有特殊字符(.和空格) PHP接收参数时,发现表单名中如果是 句号(.)或者空格( ),会被转换成下划线(_) ...
- C# 爬取网页上的数据
最近工作中需求定时爬取不同城市每天的温度.其实就是通过编程的方法去抓取不同网站网页进行分析筛选的过程..NET提供了很多类去访问并获得远程网页的数据,比如WebClient类和HttpWebReque ...
- 用SqlConnectionStringBuilder修改连接超时时间
连接是通过参数传入,欲修改超时时间. SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(connStr); scsb.C ...
- spring boot学习(7) SpringBoot 之表单验证
第一节:SpringBoot 之表单验证@Valid 是spring-data-jpa的功能: 下面是添加学生的信息例子,要求姓名不能为空,年龄大于18岁. 贴下代码吧: Student实体: ...
- js例子记载
1.获取项目路径的,不一定有用,仅作参考用: function getRootPath() { var curWwwPath = window.document.location.href; //&q ...
- Ubuntu下Code::Blocks错误
#error This file requires compiler and library support for the ISO C++ 2011 standard. This support i ...
- JDK1.5多线程提高
1.名词: 1.任务的执行与任务的提交解耦 2.任务的执行策略-可中断,取消 2.线程封闭机制: 针对单线程池而言,提高任务执行的速度,但是无需锁定 3.饥饿死锁: 任务长期得不到执行,其实就是形成闭 ...