javaweb(2.5)session

  • • 发表于 8年前
  • • 作者 大妖怪
  • • 2943 人浏览
  • • 10 条评论
  • • 最后编辑时间 8年前
  • • 来自 [技 术]

原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

我们平常登录网站,比如登录QQ空间,当你登录了进去操作,一切正常。如果你有事走了半天,网页还开着,那么你再去操作当前登录的QQ空间你会发现不管你刷新还是点什么,都会让你跳到登录页面,这就是说明你长时间未操作,登录过期了。而且细心的你会发现可能每个网站的过期时间都不一样, 百度贴吧可能是十分钟,QQ空间的可能是5分钟。那么,这个过期时间是如何实现的呢?

  • 在我们后端有个叫HttpSession的东西,以下简称session。这个session是浏览器访问服务端创建的一个HttpSession对象,代表了一次服务器和浏览器之间的会话,这个会话可以是连续的也可以断断续续。(此处强调了和浏览器之间的会话,是因为后端还可以和移动端对接,但是移动端并没有session的概念,以后我们会讲到移动端如何维护会话)
  • session维持浏览器和服务端会话的原理是:当浏览器访问成功后,我们先用以下方法获取session对象,HttpSession session = request.getSession(boolean flag);当flag = true时,服务器在默认的情况下,会将sessionId以cookie的机制发送给浏览器,浏览器保存cookie,当浏览器再次访问服务器时,会将cookie中的sessionId发送给服务器,服务器根据sessionId就可以找到对应的session对象并且将其更新。当flag = false时,服务器会先查看请求中是否包含sessionId,如果没有,返回null,此时说明会话过期,页面跳到登录页面。如果有返回sessionId对应的session对象
  • 我们还有一种获取session的方式HttpSession session = request.getSession();此方法等效于HttpSession session = request.getSession(true);
  • 以上的方式都是默认的过期时间的(ps:忘了是多少秒了~),我们还可以手动设置session的过期时间:

    • session.setMaxInactiveInterval(interval)方法体内的参数interval为秒
    • web.xml里配置如下信息
      <session-config>
      <session-timeout>时间长度(单位为分钟)</session-timeout>
      </session-config>
      
    • 在tomcat/conf/server.xml中定义defaultSessionTimeOut=时间长度(分钟)

    • 以上三种方式中当值为-1时,session永不失效

    • 三种方式的优先级为:第一种方式>第二种方式>第三种方式
  • HttpSession的生命周期:
    • 创建:当客户端浏览器第一次访问服务器时,服务器为每个浏览器创建不同的HttpSession对象。在服务器端使用request.getSession()方法来获得HttpSession对象,并以此来使用HttpSession接口为我们提供的防法
    • 使用:
      • void setAttribute(String name,Object value):进行数据的保存
      • Object getAttribute(String name):进行数据的读取
    • 结束
      • 关闭浏览器,结束session
      • 调用HttpSession的invalidate()方法,删除HttpSession对象和数据
      • 两次访问时间间隔大于session定义的非活动时间间隔
        注:在session结束时,服务器会清空当前浏览器相关的数据信息

接下来是简单的实战:

  • 在之前的基础上我们建个登录jsp页面login.jsp,并在body中写上代码:
    <!-- 表单提交,method使用post方法方法servlet中的dopost,action为login表示web.xml配置了的url是login -->
    <form method="post" action="login">
      用户名:<input type="text" name="username" width="100"/><br/><!-- 用户名提交到后台的字段是 username-->
      密码:<input type="password" name="password" width="100"/> <br/><!-- 密码提交到后台的字段是 password-->
      <input type="submit" name="登录" value="登录">
    </form>
    
  • 写一个loginServlet,顺便重写post方法:
@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    PrintWriter out=resp.getWriter();//获取输出到网页的对象

    HttpSession session=req.getSession();//获得session

    String uesrValue=(String)session.getAttribute("user");//获取session存储的属性值

    if(uesrValue==null){//还没有登录过
        String username=req.getParameter("username");//从表单中获取用户名
        String password=req.getParameter("password");//从表单中获取密码
        out.println("你还未登录<br/>");
        session.setAttribute("user", username);//设定session中的用户名
        session.setAttribute("password",password);//设定session中的密码
        out.println(session.getId());//打印session ID
    }
    else{
        String username=(String)session.getAttribute("user");//从session中获取用户名
        String password=(String)session.getAttribute("password");//从session获取密码
        out.println("用户名:"+username+"<br/>");
        out.println("密 码:"+password+"<br/>");
        session.invalidate();//使session无效
    }
    out.close();
}

运行完之后,我们手动在项目中访问login.jsp页面,输入以上方法,当我们第一次随便输入用户名和密码并且脑子里记下,然后访问:
第一次访问如下

这个表示之前没有用这个用户名登录,这是首次登录,然后传回了sessionId。
然后我们退回去,用刚刚的账号密码登录:

如图就打印了登录的用户名和密码(因为刚刚登录保存了会话)

以上工程文件放在了网盘,要看源码的可以自己去下:
http://pan.baidu.com/s/1cxlOJG

鸣谢:最近时间紧,上文的逻辑是根据文章http://blog.csdn.net/ccy0815ccy/article/details/21033523中的源码修(chao)改(xi)而来。

分享到:
10条评论
Ctrl+Enter
作者

大妖怪

大妖怪

APP:1 帖子:76 回复:200 积分:7517

已加入社区[2943]天

梦里巷口,可有你倚门回首

作者详情》
Top