JSP 会话管理

作者: 廖少少 | 来源:发表于2016-09-07 10:50 被阅读491次

    本文包括:

    1. HttpSession对象

    2. session内置对象

    3. 使用session实现访问控制

    4. JSP作用域

    5. Cookie

    6. session与Cookie的比较

    7. 小试牛刀:简化用户登录


    会话:当前浏览器与服务器间多次的请求、响应关系,被称作一个会话

    1、HttpSession对象

    1.1、HttpSession对象简介

    • 服务器为每个会话创建一个HttpSession对象

    • 每个会话对象都有一个唯一的ID

    • 把用户的数据保存在相应的HttpSession对象内

    • 第一次请求时,服务器创建一个HttpSession对象,并把该对象的ID返回给用户。同时,服务器在内存中开辟一空间,用来保存该对象数据。

    • 第二次请求把ID一起发送给服务器,服务器根据ID号寻找内存中相应的数据。

    1.2、HttpSession对象的存在周期

    • session的创建

      浏览器访问服务器时,服务器为每个浏览器创建不同的session对象

      严格描述:

      当服务器端调用 HttpServletRequest.getSession() 时,没有当前session,这时候才会创建一个session对象,注意,JSP本质是Servelt, JSP 文件在编译成 Servlet 时将会自动加上这样一条语句:

      HttpSession session = HttpServletRequest.getSession(true);

      这也是 JSP 中隐含的 session 对象的来历。

    • session的关闭

      1. 调用session. invalidate()方法,使session对象失效。

      2. 访问时间间隔大于非活动时间间隔, session对象失效。

        换种说法:

        Session 超时:超时指的是连续一定时间服务器没有收到该 Session 所对应客户端的请求,并且这个时间超过了服务器设置的 Session 超时的最大时间。

      3. 关闭服务器时,session对象失效

      注意:关闭浏览器时,session对象不会马上失效

    原始出处:深入理解 HTTP Session

    2、session内置对象

    2.1、session内置对象简介

    1. session表示客户端与服务器的一次会话

    2. Web中的session指:用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览网站所花费的时间。

    3. 从上述定义中可以看到,session实际是一个【特定的时间概念】

    4. 服务器的内存中,保存着同用户的session。

    2.2、内置对象session的常用方法

    • void setAttribute(String key,Object value):以key/value的形式保存对象值

    • Object getAttribute(String key):通过key获取对象值

    • void invalidate():设置session对象失效

    • String getId():获取sessionid

    • void setMaxInactiveInterval(int interval):设定session的非活动时间

    • int getMaxInactiveInterval():获取session的有效非活动时间(以秒为单位)

    • void removeAttribute(String key):从session中删除指定名称(key)所对应的对象

    2.3、session与窗口的关系

    • 每个session对象都与浏览器一一对应,重新开启一个浏览器,相当于重新创建一个session对象。

    • 通过超链接打开的新窗口,新窗口的session与其父窗口的session相同

    3、使用session实现访问控制

    3.1、需求说明:

    • 新闻发布系统只允许管理员能够进入后台操作页面

    • 普通用户只有浏览新闻和发布评论的权限

    3.2、业务分析:

    1. 登录处理页面

    2. 获得登录信息

    3. 查询数据库,判断该用户是否注册

    4. 如果该用户已注册,在session中保存该用户的登录信息

    5. 如果用户是管理员就跳转到管理员界面;否则跳转到新闻发布系统的首页。

    6. 管理员界面

      • 从session中提取该用户信息

      • 如果用户信息存在,显示管理员界面内容

      • 如果用户信息不存在,跳转到登录页面

    3.3、代码实现:

    1. 在控制页面获取用户请求的登录信息进行验证

       <%
       if ("admin".equals(name)&&"admin".equals(pwd){  //如果是已注册用户
           //在session中存放用户登录信息    
           session.setAttribute("login", name);
           //设置session过期时间
           session.setMaxInactiveInterval(10*60);
           //请求转发
           request.getRequestDispatcher("admin.jsp") .forward(request,response);
       } else {
       response.sendRedirect("index.jsp");}
       %>
      
    2. 在新闻发布系统新闻发布页面增加登录验证

       <%
       //session.getAttribute(String key)方法的返回值是一个Object,必须进行强制类型转换
       String login = (String) session.getAttribute("login");
           if (login == null){
               //如果session中不存在该用户的登录信息,转入登录页面
               response.sendRedirect("index.jsp");
       } %>    
      

    3.4、优化访问控制:

    1. 除了首页面,其它页面中同样需要加入登录验证,有没有办法避免冗余代码的出现?可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件。

    2. 创建登录验证文件 loginControl.jsp

       <%
       String login = (String) session.getAttribute("login");
       if (login == null)
         response.sendRedirect("index.jsp");
       %>
      

      在后台首页面中使用include指令引用登录验证文件

       <%@ include file="loginControl.jsp"    %>
      

      注意:重复定义变量。

    4、JSP作用域

    作用域:信息共享的范围

    4.1、常用作用域存/取值方法

    • setAttribute(String key,Object value):采用键/值对方式在当前作用域中储存数据

    • getAttribute(String key):以键(key)方式取出当前作用域储存的值

    4.2、内置对象名称

    1. page作用域指本JSP页面的范围

      • pageContext.setAttribute(键,值)

      • pageContext.getAttribute(键)

    2. request作用域内的对象则是与客户端的请求绑定在一起

    3. session对象作用域:一次会话

    4. application的作用域:面对整个Web应用程序

    5、cookie

    cookie是Web服务器保存在客户端的一系列文本信息

    5.1、cookie的作用:

    1. 对特定对象的追踪
    1. 统计网页浏览次数
    1. 简化登录

    5.2、安全性能:容易信息泄露

    5.3、语法:

    • 创建cookie对象

        Cookie newCookie = new Cookie(String key,String value);
      
    • 写入cookie

        response.addCookie(newCookie);
      
    • 读取cookie

        Cookie[] cookies = request.getCookies();
      

    5.4、常用方法:

    • void setMaxAge(int expiry):设置cookie的有效期,以秒为单位

    • void setValue(String value):在cookie创建后,对cookie进行赋值

    • String getName():获取cookie的名称

    • String getValue():获取cookie的值

    5.5、Cookie的中文传值问题

    • 解答:

      Version 0 cookie values are restrictive in allowed characters. It only allows URL-safe characters. This covers among others the alphanumeric characters (a-z, A-Z and 0-9) and only a few lexical characters, including -, _, ., ~ and %. All other characters are invalid in version 0 cookies.

      Your best bet is to URL-encode those characters. This way every character which is not allowed in URLs will be percent-encoded in this form %xx which is valid as cookie value.

      So, when creating the cookie do:

      Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
      // ...
      And when reading the cookie, do:

      String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
      // ...

    • 具体做法:

      在JSP文件中

        <%@page import="java.net.URLEncoder"%>
      
        ...
      
        //创建Cookie时
        Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
        
        ...
      
        //读取Cookie时    
        String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
      

    6、session与cookie的比较

    • session是在服务器端保存用户信息,Cookie是在客户端保存用户信息

    • session中保存的是对象,Cookie保存的是字符串

    • session随会话结束而关闭,Cookie可以长期保存在客户端

    • 不重要的信息使用cookie保存,重要的信息使用session保存

    7、小试牛刀:简化用户登录

    7.1、需求说明:

    • 用户第一次登录时需要输入用户名和密码

    • 在5分钟内,无需再次登录则直接显示欢迎页面

    7.2、实现思路:

    1. 用户登录后,创建cookie保存用户信息

    2. 设置cookie的有效期为5分钟

    3. 在登录页循环遍历cookie数组,判断是否存在指定名称的cookie,若存在则直接跳转至欢迎页面

    提示:使用setMaxAge(5*60)设置cookie的有效期

    相关文章

      网友评论

        本文标题:JSP 会话管理

        本文链接:https://www.haomeiwen.com/subject/rojjettx.html