第4章 session

2019-05-17  本文已影响0人  yangsg

1. HttpSession的工作原理

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


session的工作原理

2. HttpSession的API

2.1 获取session对象
HttpSession session = request.getSession();
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();
}
//随机文字
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>
<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>
//随机文字
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{
  ...
}
上一篇下一篇

猜你喜欢

热点阅读