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);