一、session简介
1、session概念
Session代表服务器与浏览器的一次会话过程。因为http是无状态的协议,所以,浏览器与服务器的会话过程是断断续续的。在servlet中,session指的是HttpSession对象。
浏览器第一次发出请求时,服务器创建session并生成一个sessionID。然后返回给浏览器。此时查看浏览器的cookie,会发现会有一个:
Cookie:JSESSIONID=sessionID
浏览器再次发出请求时,会携带该cookie,服务器就可以根据sessionID在内存中找到之前创建的session对象。所以“无状态”的HTTP协议就变的“有状态”了。
所以:session是利用了cookie。
所以:静态网页没有servlet,也就没有session的存在。
2、session的创建时间
session是在服务器开始调用函数
HttpSession session = request.getSession(true);
时,如果session还没有被创建,则创建session。
二、session跟踪实践
创建java web工程,创建一个简单的servlet。
package com.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
//使用注解的方式注册一个servlet
@WebServlet(name = "SessionTest", urlPatterns = {"/"})
public class SessionTest extends HttpServlet{
private int counter;//用来标识用户
public SessionTest() {
counter = 1;
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException{
//如果session不存在就创建一个session
HttpSession session = request.getSession(true);
//返回session创建的时间,作为参数生成date对象
Date creationTime = new Date(session.getCreationTime());
//返回该客户端最后一次访问的时间,作为参数生成date对象
Date lastAccessedTime = new Date(session.getLastAccessedTime());
String title;
String visitCountKey = "visitCount";
Integer visitCountValue = new Integer(0);//访问次数
String userIDKey = "userID";
String userIDValue;//用户ID
//客户端是不是第一次访问,没有带包含sessionID的cookie表示第一次访问
if(session.isNew()){
title = "欢迎新朋友";
visitCountValue = 0;
userIDValue = "Friend" + counter;//给他命名
counter++;
//都是key,value的形式设置。把访问次数和用户名都设置进去
session.setAttribute(userIDKey, userIDValue);
session.setAttribute(visitCountKey, visitCountValue);
}
else{//客户端携带了带sessionID的cookie,取出访问次数,加1后再设置进去
title = "欢迎老朋友";
userIDValue = (String)session.getAttribute(userIDKey);
visitCountValue = (Integer)session.getAttribute(visitCountKey);
visitCountValue = visitCountValue + 1;
session.setAttribute(visitCountKey, visitCountValue);
}
//生成响应给浏览器的页面。
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " +
"transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<h2 align=\"center\">Session 信息</h2>\n" +
"<table border=\"1\" align=\"center\">\n" +
"<tr bgcolor=\"#949494\">\n" +
" <th>Session 信息</th><th>值</th></tr>\n" +
"<tr>\n" +
" <td>id</td>\n" +
" <td>" + session.getId() + "</td></tr>\n" +
"<tr>\n" +
" <td>Creation Time</td>\n" +
" <td>" + creationTime +
" </td></tr>\n" +
"<tr>\n" +
" <td>Time of Last Access</td>\n" +
" <td>" + lastAccessedTime +
" </td></tr>\n" +
"<tr>\n" +
" <td>User ID</td>\n" +
" <td>" + userIDValue +
" </td></tr>\n" +
"<tr>\n" +
" <td>Number of visits</td>\n" +
" <td>" + visitCountValue + "</td></tr>\n" +
"</table>\n" +
"</body></html>");
}
}
可以部署到tomcat,通过访问http://localhost:8080/SessionTest/来查看结果。SessionTest是该web app的名字,由于配置了该servlet的url映射是“/”,所以上面的URL会映射到这个servlet。
简单来说,服务器会把sessionID作为cookie传递给客户端。然后当客户端访问时,服务器根据客户端携带的sessionID,来标识这个客户端,去内存中找到session对象,获取该客户端上次访问的状态信息。
“无状态”指的是浏览器和服务器之间并不存在连接,10个user各访问1次和1个user访问10次对服务器来说是一样的,服务器区分不出来。
加上了session,变的“有状态”了之后呢?
浏览器和服务器之间就存在了一个虚拟连接,同一个浏览器在一次session有效期间,每次访问都携带同一个sessionID,服务器可以根据这个sessionID去内存中找到该session,并获取这个用户上次访问的状态信息。比如,网上看视频时上次观看的进度。