Java后台---从底层了解Session会话、pageContext

来源:互联网 发布:便宜好用的护肤品知乎 编辑:程序博客网 时间:2024/05/21 21:57

Session会话简介

  • 会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
  • 会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
  • 当用户关闭浏览器,上一个Session也就无法再次获得了(CookiemaxAge-1的情况)。再次打开新的浏览器,将开始一个新的会话。
  • javax.servlet.http.HttpSession。每一个HttpSession代表用户的一个会话。
  • 每一个Session的过期时间默认为30分钟。
  • 当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户
  • 当浏览器再次访问服务器时,会携带包含了jsessionidcookie访问服务器。服务器根据此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)

如果浏览器支持CookieServlet容器就将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);    %>   





0 0