Session应用--用servlet写一次性验证码
2011-11-07 22:57
302 查看
Session应用--用servlet写一次性验证码
一 写验证码的思路
首先想到验证码的背景是看起来比较乱的,也就是要用java画出验证码的背景图片,而要想画出验证码的背景,在图片上应该有画纸,也要有画笔才能执行。可想只能是随机的画出一个形状,才有在每次刷新的时候有不一样的效果。并且在画出的背景图片上有数字或字母,这也是随机生成的。是把可能的数字和字母放到一个字符串里来显示,然后根据下标随机获取。
二 实现一次性的验证码
1.首先建一个loginForm.html的网页,在网页上插入一个图片,为画背景提供空间
在loginForm.html中的代码如下:
<body>
<h3>带有验证码的登入页面</h3>
<form action="servlet/loginFormServlet"method="post">
用户名:<inputtype="text" name="userName" size="15"/><br/>
<br/> 密 码:<input type="password"name="password" size="17"/><br/>
<br/> 验证码:<input type="text"name="checkCode"size="15"/>
<img src="servlet/checkCode"/><br/>
<br/><input type="submit" value="submit"/>
</form>
</body>
从以上的代码中可以看出<img/>标签是用来画验证码的,并且它连接到的servlet是checkCode,所以建一个CheckCodeServlet来话验证码
2.建立一个checkCodeServlet.java 它的映射名为servlet/checkCode
(1)首先修改类型,因为传来的是一个图片的信息
response.setContentType("image/jpeg");
(2)设置没有缓存---因为在每次刷新之后都会是不同的数字或字母
因为每个浏览器都是不同的,所以应设置三个没有缓存的字段
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Controll","no-cache");
response.setIntHeader("Expires",0);
(3)画纸是存在一个缓冲区中的
BufferedImage bi=new
BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
注:缓冲区的宽、高、和使用的颜色
(4)画笔的设置---用Graphics来画
Graphics g = bi.getGraphics();
(5)设置背景 --------调用函数drawBackground()
drawBackground(g);
public void drawBackground(Graphicsg) {
// 填充颜色
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);
}
}
(6) 随机产生验证码-----调用一个方法
char[] rands =generateCheckCode();
private char[] generateCheckCode() {
// 字符串存储所有可能的字符
String chars ="0123456789abcdefghijklmnopqlstuvwxyz";
char rands[] = new char[4];
for (int i = 0; i < 4; i++) {
// 通过下标获取
int random = (int) (Math.random() * 36);
rands[i] = chars.charAt(random);
}
return rands;
}
(7) 输出--------输出的时候要随机的输出
drawRands(g, rands);
private void drawRands(Graphics g, char[] rands) {
// 画笔的颜色
g.setColor(Color.black);
// 设置输出的字符的格式
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 输出字符
g.drawString("" +rands[0], 1, 17);
g.drawString("" +rands[1], 16, 18);
g.drawString("" +rands[2], 32, 15);
g.drawString("" +rands[3], 46, 19);
}
(8)第七步只是写到内存里去了,要想在网页上显示,要进行内存和内存之间的装换,即是字节和字节的装换。并放到一个字节里,通过网页输出。
// 在内存中字节的转换
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bi, "JPEG", bos);
byte[] buf =bos.toByteArray();// 将bi对象的内容转换成一个字节数组
ServletOutputStream out =response.getOutputStream();
out.write(buf);
(9)设置应答内容的长度
response.setContentLength(buf.length);
(10)把输出的验证码存放到session中
HttpSession session = request.getSession();
session.setAttribute("checkCode",new String(rands));
最后的效果为:
补充:
重写URL,在禁用Cookie的时候用的方法
encodeURL()方法
encodeRedirectURL()方法
例子:
//对目标地址进行重写,系统会自动的在session4之后加上地址
out.print("<ahref='"+response.encodeURL("session4")+"'>Servlet2</a>");
Cookie功能没有关闭
url重写 :第一次提交请求,在请求消息没有包含sessionid
一 写验证码的思路
首先想到验证码的背景是看起来比较乱的,也就是要用java画出验证码的背景图片,而要想画出验证码的背景,在图片上应该有画纸,也要有画笔才能执行。可想只能是随机的画出一个形状,才有在每次刷新的时候有不一样的效果。并且在画出的背景图片上有数字或字母,这也是随机生成的。是把可能的数字和字母放到一个字符串里来显示,然后根据下标随机获取。
二 实现一次性的验证码
1.首先建一个loginForm.html的网页,在网页上插入一个图片,为画背景提供空间
在loginForm.html中的代码如下:
<body>
<h3>带有验证码的登入页面</h3>
<form action="servlet/loginFormServlet"method="post">
用户名:<inputtype="text" name="userName" size="15"/><br/>
<br/> 密 码:<input type="password"name="password" size="17"/><br/>
<br/> 验证码:<input type="text"name="checkCode"size="15"/>
<img src="servlet/checkCode"/><br/>
<br/><input type="submit" value="submit"/>
</form>
</body>
从以上的代码中可以看出<img/>标签是用来画验证码的,并且它连接到的servlet是checkCode,所以建一个CheckCodeServlet来话验证码
2.建立一个checkCodeServlet.java 它的映射名为servlet/checkCode
(1)首先修改类型,因为传来的是一个图片的信息
response.setContentType("image/jpeg");
(2)设置没有缓存---因为在每次刷新之后都会是不同的数字或字母
因为每个浏览器都是不同的,所以应设置三个没有缓存的字段
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Controll","no-cache");
response.setIntHeader("Expires",0);
(3)画纸是存在一个缓冲区中的
BufferedImage bi=new
BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
注:缓冲区的宽、高、和使用的颜色
(4)画笔的设置---用Graphics来画
Graphics g = bi.getGraphics();
(5)设置背景 --------调用函数drawBackground()
drawBackground(g);
public void drawBackground(Graphicsg) {
// 填充颜色
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);
}
}
(6) 随机产生验证码-----调用一个方法
char[] rands =generateCheckCode();
private char[] generateCheckCode() {
// 字符串存储所有可能的字符
String chars ="0123456789abcdefghijklmnopqlstuvwxyz";
char rands[] = new char[4];
for (int i = 0; i < 4; i++) {
// 通过下标获取
int random = (int) (Math.random() * 36);
rands[i] = chars.charAt(random);
}
return rands;
}
(7) 输出--------输出的时候要随机的输出
drawRands(g, rands);
private void drawRands(Graphics g, char[] rands) {
// 画笔的颜色
g.setColor(Color.black);
// 设置输出的字符的格式
g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
// 输出字符
g.drawString("" +rands[0], 1, 17);
g.drawString("" +rands[1], 16, 18);
g.drawString("" +rands[2], 32, 15);
g.drawString("" +rands[3], 46, 19);
}
(8)第七步只是写到内存里去了,要想在网页上显示,要进行内存和内存之间的装换,即是字节和字节的装换。并放到一个字节里,通过网页输出。
// 在内存中字节的转换
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(bi, "JPEG", bos);
byte[] buf =bos.toByteArray();// 将bi对象的内容转换成一个字节数组
ServletOutputStream out =response.getOutputStream();
out.write(buf);
(9)设置应答内容的长度
response.setContentLength(buf.length);
(10)把输出的验证码存放到session中
HttpSession session = request.getSession();
session.setAttribute("checkCode",new String(rands));
最后的效果为:
补充:
重写URL,在禁用Cookie的时候用的方法
encodeURL()方法
encodeRedirectURL()方法
例子:
//对目标地址进行重写,系统会自动的在session4之后加上地址
out.print("<ahref='"+response.encodeURL("session4")+"'>Servlet2</a>");
Cookie功能没有关闭
url重写 :第一次提交请求,在请求消息没有包含sessionid
相关文章推荐
- Session应用--用servlet写一次性验证码
- Session应用--用servlet写一次性验证码
- Session应用--用servlet写一次性验证码
- Servlet自学第24讲:Session应用—验证码功能的实现
- Session应用:验证码技术
- Servlet第六篇【Session介绍、API、生命周期、应用、与Cookie区别】
- 笔记之Servlet的Response对象(应用:文件下载、随机验证码)
- Servlet——Session(2)之简单应用
- 一个利用Session实现一次性验证码
- Servlet第六篇【Session介绍、API、生命周期、应用】
- (15)session原理,应用(防止用户非法登录、验证码、关闭浏览器再开启浏览器还能访问之前的session)
- 会话中session实现一次性验证码(源码)
- 通过Session案例分析一次性验证码登录
- Session应用之验证码
- 笔记之Servlet的会话管理技术(cookie、session)(应用:用户自动登录、防表单重复提交)
- url重写实现session跟踪和一次性验证码的实现
- Session实现一次性验证码
- servlet实现一次性验证码
- Servlet第七篇【Cookie和Session的区别、应用】
- Servlet--Session属性Attribute应用登录