Session:
浏览器访问Web服务器的时候,服务器会在内存中为每一个浏览器创建一个Session对象,该对象有一个独一无二的ID称为SessionId,并且服务器会将这个SessionId发送给浏览器,这样浏览器再次访问服务器时,会将这个SessionId传递过来。服务器可以根据SessionId找到Session对象。用以判断是否是同一个浏览器。
获取Session:HttpSession s = request.getSession(boolean flag)
常用方法:
void setAttribute(String name, Object obj)
Object getAttribute(String name)
void removeAttribute(String name)
Session.invalidate()
用户访问需要保护的资源时,通常使用Session。例如:只有通过登录才能访问后台页面。
Session通常保存为30分钟。
可以在web.xml中配置<session-config><session-timeout>30</session-timeout></session-config>修改,也可以通过方法,session.setMaxInactiveInterval(int seconds)设置
如果Cookie被用户禁止则可以通过URL重写方式发送sessionId;
response.encodeURL(String url)
response.encodeRedirectURL(String url)
优点:安全,保存数据类型丰富,保存数据量大
缺点:保存在服务器端,内存大,影响服务器性能。
验证码:
//0.创建空白图片
BufferedImage image = new BufferedImage(100,30,BufferedImage.TYPE_INT_RGB);
//1.获取图片画笔
Graphics g = image.getGraphics();
Random r = new Random();
//2.设置画笔颜色
g.setColor(new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
//3.绘制矩形的背景
g.fillRect(0, 0, 100, 30);
//4.调用自定义的方法,获取长度为5的字母数字组合的字符串
String number = getNumber(5);
HttpSession session = request.getSession();
session.setAttribute("code", number);
g.setColor(new Color(0,0,0));
g.setFont(new Font(null,Font.BOLD,24));
//5.设置颜色字体后,绘制字符串
g.drawString(number, 5, 25);
//6.绘制8条干扰线
for(int i=0;i<8;i++){
g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(r.nextInt(100), r.nextInt(30), r.nextInt(100), r.nextInt(30));
}
response.setContentType("image/jpeg");
OutputStream ops = response.getOutputStream();
ImageIO.write(image, "jpeg", ops);
ops.close();
}
private String getNumber(int size){
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String number = "";
Random r = new Random();
for(int i=0;i<size;i++){
number+=str.charAt(r.nextInt(str.length()));
}
return number;
}