Cookie功能没有关闭
url重写
第一次提交请求,在请求消息没有包含session的cookie,产生应答的时候用url重写的技术
以后再提交请求的时候,请求消息中就会包含session的cookie
Cookie功能没有被禁掉:产生的应答消息都会用url重写
Session实例:一次性验证码
loginForm.html
<img src=”servlet/checkCode”>
CheckCodeServlet:产生验证码 放在session对象里面
LoginFormServlet:输入的验证码和图片中显示的验证码是否一致
实现代码:
CheckCodeServlet部分
private static final long serialVersionUID = 1L;
private static int WIDTH = 60;
private static int HEIGHT = 20;// 图片高为20像素
doGet方法中
response.setContentType("image/jpeg");// 应答内容的类型
ServletOutputStream out = response.getOutputStream();
HttpSession session = request.getSession();// 会话对象的获取
// 不能在客户端缓存验证码图片
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Controll", "no-cache");
response.setIntHeader("Expires", 0);// 设置失效时间
// 画图——在内存中开辟一片缓冲区————背景
BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,
BufferedImage.TYPE_INT_RGB);// 制定画纸的宽度和高度
Graphics g = bi.getGraphics();// 通过画纸调用方法得到画笔
drawBackground(g);
// 随机产生验证码
char[] rands = generateCheckCode();// 随机产生4位的验证码
// 输出,画在画纸上
drawRands(g, rands);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bi, "JPEG", bos);// 按照什么样的形式转换JEPG
// 定义一个字节数组
byte[] buf = bos.toByteArray();// 将bi对象里面内容转换成了一个字节数组
out.write(buf);
// 设置应答内容的长度
response.setContentLength(buf.length);
session.setAttribute("checkCode", new String(rands));
out.flush();
out.close();
}
drawRands方法
private void drawRands(Graphics g, char[] rands) {
// 画笔颜色
g.setColor(Color.black);
// 字符输出的字体,并加粗倾斜,字体大小为18
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 把字符输出
g.drawString("" + rands[0], 1, 15);// 第1个字符
g.drawString("" + rands[1], 16, 14);// 第2个字符
g.drawString("" + rands[2], 31, 18);// 第3个字符
g.drawString("" + rands[3], 46, 12);// 第4个字符
System.out.println("=============");
System.out.println(new String(rands));
}
generateCheckCode方法
private char[] generateCheckCode() {
String chars = "0123456789abcdefghijklmnopqrstuvwxyz";// 把所有可能的字符放在一个数组里
// 定义一个用来存放随机数的数组
char rands[] = new char[4];
for (int i = 0; i < 4; i++) {
int random = (int) (Math.random() * 36);// 随机产生chars中的下标
rands[i] = chars.charAt(random);
}
return rands;
}
drawBackground方法
private void drawBackground(Graphics g) {
// 画背景
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, WIDTH, HEIGHT);// 填充的矩形,左上角和右下角顶点坐标
// 画干扰线
for (int i = 0; i < 120; i++) {
// 随机产生数据,左上角坐标
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
// 椭圆的颜色为随机的
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);// 随机产生椭圆的线条,没有被填充
}
}
LoginFormServlet部分
HttpSession session = request.getSession();
String code = request.getParameter("checkCode");
String value = session.getAttribute("checkCode").toString();
if(value.equals(code)){
out.println("验证码正确");
}else{
out.println("<font color=red>验证码不正确</font>");
}
loginForm.html部分
<h3>带有验证码的登录页面</h3>
<form method="post" action="loginFormServlet" name="form1">
用户名:<input type="text" name="userName"/></br>
密 码:<input type="password" name="password"/></br>
验证码:<input type="text" name="checkCode"/>
<img src="servlet/CheckCode"/></br>
<input type="submit" value="submit"/>
</form>