欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp 会话跟踪技术

程序员文章站 2022-03-14 23:49:44
...

一、什么是会话
了解什么是会话跟踪技术之前我们首先要知道会话到底是什么:
会话是指一个终端用户(服务器)与交互系统(客户端)进行通讯的过程。
而什么又是会话跟踪?
对同一个用户对服务器的连续的请求和接受响应的监视。(将用户与同一用户发出的不同请求之间关联,为了数据共享),这就是会话跟踪。
我们为什么要对会话进行跟踪呢?
这是因为浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求 。
四种会话跟踪技术
String sessionId = request.getRequestedSessionId(); //获得sessionId
1)URL重写:
URL(统一资源定位符)是Web上特定页面的地址,URL地址重写的原理是将该用户Session的id信息重写 到URL地址中,以便在服务器端进行识别不同的用户。URL重写能够在客户端停用cookies或者不支持cookies的时候仍然能够发挥作用。
客户端浏览器向服务器发出请求时,会在URL地址后面加上类似于“sessionID=*”形式的参数,服务器端通过获取sessionID关键字来获取会话值来判断是哪个用户发送的请求。
但是在程序第一次访问服务器端时,服务端并不能确认客户端浏览器是否支持Cookie。因此,当服务器第一次发出请求时,服务端会默认采用URL重写,也就是将SESSIONID写到URL地址中传递。
之后当客户端发送请求后,服务器会根据提交给客户端浏览器的信息自动检查客户端是否启用了Cookie,如果启用,将不再进行URL重写。如果没有,则继续使用URL重写。

String sessionId = request.getRequestedSessionId(); //获得sessionId

通过response对象的encodeURL(StringURL)实现URL地值重写:

<a href="<%=response.encodeURL("index.jsp") %>"> 
    index页面</a>

该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会调用encodeURL()方法之后会自动将用户Session的id重写到URL中。重写后的输出可能是这样的:

a href="index.jsp?jsessionid=0E0C61100AEB06DE6A95EB1CD1DA8158">index页面</a>

HttpServletResponse接口定义了两个用于URL重写的方法:
encodeURL方法,用于超链接和form表单的action属性中设置的URL进行重写
encodeRedirectURL 方法 用于对传递给HttpServletResponse.sendRedirect()方法的URL进行重写
他们根据请求消息中是否含有Cookie头字段来决定是否进行url重写。把URL作为参数传递给这两个方法,他们就能完成url重写,在url后面添加 jsessionid参数及其值。可以关闭浏览器的Cookie,然后,进行实验,在网页源文件中查看URL后面是否有jsessionid参数及其值。

2)隐藏表单域:
通过进行信息的传递 。将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示,浏览时看不到,源代码中有。
比如第二个表单中获取第一个表单中的内容,并以隐藏域( 文本框type为 hidden) 的方式接受第一个表单中的内容,再次传递到第三个表单中。通俗点说请求的顺序是这样的:表单一 - - > 表单二 - - >表单三,但是表单三需要用到表单一提交的内容,所以就会需要表单二作为过渡,把表单一的内容以隐藏域的形式保存,然后再传递到表单三中。
3) Cookie:
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。 服务器创建保存于浏览器端,不可跨域名性,大小及数量有限。客户端可以采用两种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后这个Cookie对象将消失。另外一种方式是保存在客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是这个Cookie在有效期内。 这样就实现了对客户的跟踪。 Cookie是可以被禁止的。
Cookie不是内置对象,需要自己创建Cookie的实例。是服务器往客户端写的一段文本信息,该信息是可以修改的,所以一般情况cookie会存储一些非敏感信息,当客户端再次请求服务器的时候,会将Cookie以请求头的方式发送到服务器,这个时候服务器就能区分是谁在访问了。

Cookie cookie = new Cookie("键", "值"); //创建cookie
cookie.setMaxAge(60*60*24);//设置cookie的有效期
cookie.setPath("/");  //设置cookie的有效范围(路径)
response.addCookie(cookie);  //将cookie写入到客户端

4) session:
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。 保存在服务器端。需要解决多台服务器间共享问题。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。
在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。
Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。

session.setAttribute(String name,Object obj); //往session中存放内容(通过键和值的形式)
session.getAtrribute(String name);//通过键从session中获取内容
session.removeAttribute(String name);//把存储在session中的对象移除
session.invalidate();//销毁session

销毁session
当客户端长时间不向服务器发送请求后,session对象会自动消失,但对于某些实时统计在线人数的网站,每次都等session过期后才能统计出准确的人数就不行,必须要手动销毁session。
当session被销毁后,在调用session对象的任何方法,都会报出Session already invalidated异常.

设置session有效期的三种方式:
tomcat->config->web.xml中设置30的值
当前项目的web.xml中设置30的值
通过代码设置session.setMaxInactiveInterval(30);
会话超时管理
getLastAccessesTime():返回客户端最后一次与会话相关联的请求时间
getMaxInactiveInterval():以秒为单位返回一个会话内两个请求最大的时间间隔
setMaxInactiveInterval():一秒为单位设置session的有效时间