前段时间看到web中会话跟踪技术,经过收集并整理将学习结果记录在此。
1.什么是会话
客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话 。
2.什么是会话跟踪
对同一个用户对服务器的连续的请求和接受响应的监视 。
3.为什么需要会话跟踪
浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求
4.介绍
当服务器响应客户端的第一次请求时,将会创建一个新的session对象(该对象实现了HttpSession接口)和一个唯一的ID分配给该请求,以后 客户将此会话ID与请求一起传给服务器,此会话ID在后续的请求中会将用户与session对象进行匹配,用于识别不同的客户。
5.会话跟踪常用的方法:
① URL重写
URL(统一资源定位符)是Web上特定页面的地址,URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户 。
如果用户没有禁用cookie,而且又使用URL重写,则:用户在第一次访问EncodeURLServlet时,由于不知道用户是否禁用了 cookie,所以response.encodeURL()方法内部会将JSESSIONID重写在url上,但是一旦第二次访问时,由于用户是带着 cookie来的,所以response.encodeURL()不会将JSESSIONID重写在url上。
但是如果用户禁用cookie,则关闭了浏览器后,重新开启浏览器,则回话失效,无法实现回话跟踪;如果是用户没有禁用cookie,则可以通过设置装载JSESSIONID的cookie的失效时间来控制浏览器关闭后session仍未失效。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
request.getSession(); //创建session
//调用response的encodeURL方法,将自动将JSESSION追加到url后面,如:url;jsessionid=BD111FFC653497E81B702A29B3AC6FE4
String buyurl = response.encodeURL("/CookieAndSession/servlet/buy");
String payurl = response.encodeURL("/CookieAndSession/servlet/pay");
out.print("<a href=‘"+buyurl+"‘>购买</a><br/>");
out.print("<a href=‘"+payurl+"‘>结账</a><br/>");
}
② 隐藏表单域
将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示 。
③ Cookie
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用。
客户端可以采用两种方式来保存这个Cookie对象,一种方式是保存在客户端内存中,称为临时Cookie,浏览器关闭后 这个Cookie对象将消失。另外一种方式是保存在 客户机的磁盘上,称为永久Cookie。以后客户端只要访问该网站,就会将这个Cookie再次发送到服务器上,前提是 这个Cookie在有效期内。这样就实现了对客户的跟踪。
Cookie是可以被禁止的。
//在服务器端获取Cookie
Cookie[]cookies = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length;i++) {
Cookiecookie = cookies[i];
System.put.println(cookie.getName());
}
//在服务器端设置Cookie
String username = "sa";
Cookie usernameCookie = new Cookie("username", username);
response.addCookie(usernameCookie);
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写入到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。
Cookie默认的maxAge值为-1。
如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除。
response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,并添加到response中覆盖原来的Cookie。
如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。
④ Session
每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。在服务器端会创建一个session对象,产生一个sessionID来标识这个session对象,然后将这个sessionID放入到Cookie中发送到客户端,下一次访问时,sessionID会发送到服务器,在服务器端进行识别不同的用户。Session是依赖Cookie的,如果Cookie被禁用,那么session也将失效。因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。此时可以考虑URL重写和表单隐藏域。
原理:在后台,系统从cookie或者url中提取用户ID,这些动作对程序员是透明的,你只需调用getSession,
如果在输入的cookie和url中找不到会话ID,系统会创建一个新的空会话。如果使用的是cookie(默认),系统还会创建一个名为
JSESSIONID的输出cookie,在其中存储一个唯一的值表示会话ID。(在服务器端读取的时候就是通过这个来识别Session的)
如果不存在会话的时候不想创建新的会话,可以使用HttpSession session = request.getSession(false);,如果不存在session对象就得到一个null值,并不创建空的session对象。
removeAttribute(“key”) 废弃与指定键关联的值
invalidate删除整个会话(在当前web应用中)
logout将用户从web服务器中注销,并删除所有属于他的会
HttpSession session = request.getSession();
设置session的空闲失效时间有两种方式:
1.在web.xml中设置:
<session-config>
<session-timeout>2</session-timeout>
</session-config>
2.设置session的maxInactiveInterval属性,(session的 默认空闲失效时间为30分钟,即30分钟内不访问服务器,session将自动销毁)如下:
session.setMaxInactiveInterval(2*60);
也可以通过 session.invalidate();销毁session。