Session会话简介:
- 会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
- 会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
- 当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况)。再次打开新的浏览器,将开始一个新的会话。
- 类javax.servlet.http.HttpSession。每一个HttpSession代表用户的一个会话。
- 每一个Session的过期时间默认为30分钟。
- 当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户
-
当浏览器再次访问服务器时,会携带包含了 jsessionid 的 cookie 访问服务器。服务器根据此 id 返回此用户的 HttpSession 对象,就保持了会话
下面是我自己整理了与浏览器的交互图:
知识点1:因为浏览器的默认过期时间为-1,就是关闭浏览器,要想解决不小心关闭浏览器而想找回刚刚保存的信息,就必须在服务器端加入如下代码
//把cookie技术和session技术联合起来做应用的一个例子---※功能:让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息
//向客户端写一个key为"JSESSIONID"用value为sessionid的cookie,
Cookie c=new Cookie("JSESSIONID",request.getSession().getId());
c.setPath(request.getContextPath());
c.setMaxAge(60*60);//一小时过期
response.addCookie(c);
知识点2:想要在登录一个网站后安全退出,那么就必须切换JSESIOONID。服务器端加入如下代码
request.getSession().invalidate();
当用户登录后,一般在
Session
中保存有用户的信息。
•
Session.setAttirubte
(…)
用户退出时,应该当将自己的信息从
Session
中清除-即安全退出。
•
Session.invalidate
();
•
Session.removeAttribute
(…)
知识点3:重写url技术---破解用户禁用cookie之后,我们session无效的问题(实质是对get利用get方式进行传值——jsessionid)
如果浏览器支持
Cookie
,
Servlet
容器就将
SessionID
作为
Cookie
保存在浏览器的客户端。但如果出于安全的考虑,用户禁用了
Cookie
,那么
Servlet
容器又如何来跟踪会话呢?
利用
response.encodeURL("servlet")
在要调用servlet的地方改servlet为
response.encodeURL("servlet")
<form action=<%=response.encodeURL("SaveServlet")%> method="post"> Name:<input type="text" name="name"/><br/> <input type="submit" value="提交"/> </form> <a href="<%=response.encodeURL("GetServlet")%>">读取几个容器中的数据</a>
pageContext<h2>演示一下jsp中的4个容器---pageContext之前没遇到过</h2> <% //从小到大的4个容器 //pageContext.setAttribute("name", "page-Jack"); //request.setAttribute("name", "request-Jack"); //session.setAttribute("name", "session-Jack"); //application.setAttribute("name", "application-Jack"); %> <% //从小到大的4个容器//这一段的功能等价于上面一段----全是通过pageContext.setAttribute()实现 pageContext.setAttribute("name", "page-Jack",PageContext.PAGE_SCOPE); pageContext.setAttribute("name", "page-Jack",PageContext.REQUEST_SCOPE); pageContext.setAttribute("name", "page-Jack",PageContext.SESSION_SCOPE); pageContext.setAttribute("name", "page-Jack",PageContext.APPLICATION_SCOPE); %> okok <% out.println( pageContext.getAttribute("name") ); out.println( request.getAttribute("name") ); out.println( session.getAttribute("name") ); out.println( application.getAttribute("name") ); %> <%//这一段的功能等价于上面一段----全是通过pageContext.getAttribute()实现 out.println( pageContext.getAttribute("name",PageContext.PAGE_SCOPE) ); out.println( pageContext.getAttribute("name",PageContext.REQUEST_SCOPE) ); out.println( pageContext.getAttribute("name",PageContext.SESSION_SCOPE) ); out.println( pageContext.getAttribute("name",PageContext.APPLICATION_SCOPE) ); %> <br/><br/> <% //pageContext.findAttribute()方法会(从小到大的容器)依次从pageContext、request、session和application中查找对应的属性,找到一个,后面就不会再找了 String str1 =(String) pageContext.findAttribute("name"); out.println(">>>"+str1); %>