第4章 session
2019-05-17 本文已影响0人
yangsg
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{
...
}