1.什么是Session

它是一个服务器对象,用来存储一个会话内的共享数据。例如用户登录系统中,把当前用户保存在session中,session为当前会话中所有的请求共享。

2.Session原理

1.首次去银行,需要开户,户保存在银行,卡(卡上有卡号)给用户
2.再次去银行,用户带上卡,银行通过卡号找到对应的账户。
对应的session
1.会话开始的时候,服务器创建session对象,把sessionid给客户端保存(通过cookie.jsessionid)
2.然后再发请求,把sessionid带给服务器,服务器通过sessionid找到对应的session
如果浏览器关闭了,那么cookie就会死去,因为这个cookie的maxAge为-1.
如果用户再次访问服务器,服务器发现没有给的sessionid,那么就认为是第一次访问,这时又重新创建了一个新的session,并且再向客户端发送这个新的sessionid.
例如:SessionServlet

response.setContentType("text/html;charset=utf-8");
  PrintWriter out=response.getWriter();   
//如果session对象存在,则不再创建,就用原来的session,如果不存在,则创建新的session      
  HttpSession session=request.getSession();
//如果session对象存在,则不再创建,就用原来的session.如果不存在,不创建新的session,返回值为null
 //HttpSession session=request.getSession(false);
 out.println("sessionid:"+session.getId());

第一次打开后,再关闭。再打开会发现sessionid变了
如果加上cookie的保存日期,再试验一下发现第二次打开和第一次是一样的

response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();      
HttpSession session=request.getSession();
out.println("sessionid:"+session.getId());
Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60);
response.addCookie(cookie);

如果用户打开服务器上的一个页面长时间不动。服务器就会把这个session销毁,而这时用户没有关闭浏览器,客户上的sessionid一直存在,如果用户又有了新的操作,这时服务器根据用户提交的sessionid找不到session了,服务器会当成是第一次访问。

有效时间在web.xml中设置,默认值由Servlet容器定义。在tomcat安装目录\conf\web.xml文件中,找到如下配置30 默认是30分钟。
也可以单独设置自己应用的web.xml
除了过期时间外,还可以通过invalidate()方法强制失效。

3…利用url重写Session跟踪

如果关闭了Cookie,如何处理。
利用Url重写实现Session跟踪

response.setContentType("text/html;charset=utf-8");
PrintWriter out =response.getWriter();
String url="/CartServlet";
HttpSession session=request.getSession();
String newurl=response.encodeUrl(url);
out.write("<a href='"+newurl+"'>单击购买</a><br>");
out.flush();
out.close();

运行代码结果:

<a href='/JavaTeachR/Cart;jsessionid=12FD82995A3A9C6419BC80B8BD36B42E'>单击购买</a>

在HttpServletResponse接口中,定义了两个用于完成URL重写的方法:
(1)encodeURL(String url) :用于对超链接和form表单的action属性中设置的URL进行重写,转成带jsessionid的超链接
(2)encodeRedirectURL(STring url):用于对要传递给HttpServletResponse.sendRedirect方法的URL进行重写

4.Session对象存值取值案例

Session对象存值演示案例
需求:在SessionServlet1中存入username值,然后在GetServlet中把存入 的username值取出来。注意观察session的生命周期。
SessionServlet1:

//创建Session
  HttpSession session=request.getSession();
  //向Session对象中存值
  session.setAttribute("username","zhangsan");
//向Cookie放值 ,键: JSESSIONID 值:session.getId()
  Cookie cookie=new Cookie("JSESSIONID",session.getId());
  cookie.setMaxAge(60*60*2);
  response.addCookie(cookie);

GetServlet:

response.setContentType("text/html;charset=utf-8");
  PrintWriter out=response.getWriter();
 //创建Session
  HttpSession session=request.getSession();
  String username=(String)session.getAttribute("username");
  out.print("name:"+username);