美文网首页
第4章 session

第4章 session

作者: yangsg | 来源:发表于2019-05-17 11:36 被阅读0次

    1. HttpSession的工作原理

    session是会话,在客户端和服务器多次交互过程中,始终能够保持数据存在一种会话跟踪技术。session也被称为会话级作用域
    session的原理


    session的工作原理

    2. HttpSession的API

    2.1 获取session对象
    • 在servlet中:使用request对象获取session、
    HttpSession session = request.getSession();
    
    • 在JSP中:session是默认隐式对象之一,无需声明可以直接使用
    2.2 session作用域

    与request作用域类似,从session作用域中存取数据的方法

    session.setAttribute("key", obj);
    Object o = session.getAttribute("key");
    

    从session作用域中移除某个数据的方法

    session.removeAttribute("key");
    
    2.3 销毁session

    可以通过invalidate方法销毁session

    session.invalidate();
    

    3. 其他作用域

    除了request和session外,还有另外两个作用域

    作用域 级别 范围
    page 页面级作用域 仅在本页有效
    request 请求级作用域 在一次请求和响应之间
    session 会话级作用域 在一次会话之间,关闭浏览器或超时会失效
    application 应用级作用域 服务器运行期间,直到服务器关闭,所有用户共享一个application作用域空间

    在使用作用域有一个原则:能用小的作用域解决的问题,坚决不使用大的作用域

    4. session的实例应用

    验证码功能
    验证码是一种图灵测试,区分操作是人还是程序。
    验证码功能涉及知识点

    • 随机内容
    public static String getRandomString(int n) {
        Random r = new Random();
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < n; i++) {
            int type = r.nextInt(3); //[0,2]
        if(type == 0) {
            //数字
            int x = r.nextInt(10);
            sb.append(x);
        }else if(type == 1) {
            //小写
            int x = r.nextInt(26); //[0,25]
            int a = 97 + x;
            char c = (char)a;
            sb.append(c);
        }else {
            //大写
            int x = r.nextInt(26); //[0,25]
                int a = 65 + x;
                char c = (char)a;
                sb.append(c);   
            }
        }
        return sb.toString();
    }
    
    • 生成图片并下发给客户端
      在Servlet的doGet或doPost方法中生成动态图片并下发给客户端
    //随机文字
    String str = RandomUtil.getRandomString(4);
    //根据随机文字生成图片
    //内存中图片对象
    BufferedImage img = new BufferedImage(120, 35, BufferedImage.TYPE_INT_RGB);
    //画笔
    Graphics g = img.getGraphics();
    //设置画笔颜色
    g.setColor(new Color(51, 153, 155));
    //绘制背景
    g.fillRect(0, 0, 120, 35);
    //重新设置画笔颜色
    g.setColor(new Color(255, 102, 51));
    //设置字体
    g.setFont(new Font("Arial", Font.BOLD, 30));
    //绘制文字
    g.drawString(str, 10, 25);
    
    //下发图片
    ImageIO.write(img, "png", response.getOutputStream());
    

    客户端需要使用img标记接收,/getImage是Servlet的访问url

    <img src="/20190517/getImage" width="120" height="35"><br>
    
    • 刷新图片
      需要为点击图片触发后的操作追加时间戳,如果不加时间戳,浏览器会认为请求新图片的连接在缓存中已经存在,不会去服务器进行新的请求,所以图片不会刷新。添加了时间戳之后,每次请求的url都是不一样的,浏览器认为请求的内容是不一致的,不会使用缓存。
    <img id="img1" src="/20190517/getImage" style="cursor:pointer" width="120" height="35" onclick="getNewImage();"><br>
    <script type="text/javascript">
        function getNewImage(){
            var d = new Date();
            document.getElementById("img1").src = "/20190517/getImage?timestamp="+d.getTime();
        }
    </script>
    
    • 比对
      在生成图片的代码中,将生成的文字内容存入session
    //随机文字
    String str = RandomUtil.getRandomString(4);
    //将生成的文字存入session,用于后续的比对
    HttpSession session = request.getSession();
    session.setAttribute("ocode", str);
    

    在用户输入验证码提交处理的Servlet中进行比对

    String vcode = request.getParameter("vcode"); //用户输入的验证码
    //在session中将生成的验证码取出
    HttpSession session = request.getSession();
    String ocode = (String)session.getAttribute("ocode"); //系统生成的验证码
            
    if(vcode.equalsIgnoreCase(ocode)) {
      ...
    }else{
      ...
    }
    

    相关文章

      网友评论

          本文标题:第4章 session

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