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

Session会话简介

  • 会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
  • 会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
  • 当用户关闭浏览器,上一个Session也就无法再次获得了(CookiemaxAge-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);
    %>
   





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值