首先是要生成验证码:
package
XX.XX
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
import
java.io.
*
;
import
java.util.
*
;
import
javax.imageio.
*
;
import
java.awt.
*
;
import
java.awt.image.
*
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
public
class
ImageEnsure
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public ImageEnsure() ... {
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
private char mapTable[] = ... { ' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' ,
' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' } ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
public String getEnsure( int width, int height, OutputStream os) ... {
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if (width <= 0 )
width = 60 ;
if (height <= 0 )
height = 20 ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 获取图形上下文
Graphics g = image.getGraphics();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 设定背景色
g.setColor( new Color( 0xDCCCCC ));
g.fillRect( 0 , 0 , width, height);
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 画边框
g.setColor(Color.black);
g.drawRect( 0 , 0 , width - 1 , height - 1 );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 取随机产生的认证码
String strEnsure = "" ;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 4代表4位验证码
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
for ( int i = 0 ; i < 4 ; ++ i) ... {
strEnsure += mapTable[( int ) (mapTable.length * Math.random())];
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 将认证码显示到图象中
g.setColor(Color.red);
g.setFont( new Font( " Atlantic Inline " , Font.PLAIN, 14 ));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 画的具体坐标
String str = strEnsure.substring( 0 , 1 );
g.drawString(str, 8 , 14 );
str = strEnsure.substring( 1 , 2 );
g.drawString(str, 20 , 15 );
str = strEnsure.substring( 2 , 3 );
g.drawString(str, 35 , 18 );
str = strEnsure.substring( 3 , 4 );
g.drawString(str, 45 , 15 );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 释放图形上下文
g.dispose();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
try ... {
// 输出图象到页面
ImageIO.write(image, " JPEG " , os);
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} catch (IOException e) ... {
return "" ;
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
return strEnsure;
}
}
然后是调用,可以在页面调用,也可以在servlet中调用,我推荐是单独的一个servlet调用,在页面调用可能会出现异常,但是不影响使用。在servlet中写上如下的代码:
//
禁用缓存,每次访问此页面,都重新生成
response.setHeader(
"
Pragma
"
,
"
No-cache
"
);
response.setHeader(
"
Cache-Control
"
,
"
no-cache
"
);
response.setDateHeader(
"
Expires
"
,
0
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
生成验证码的实例对象
ImageEnsure ie
=
new
ImageEnsure();
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
调用里面的方法,返回的是生成的验证码中的字符串
String str
=
ie.getEnsure(
0
,
0
,response.getOutputStream());
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
获得session,并把字符串保存在session中,为后面的对比做基础
HttpSession session
=
request.getSession();
session.setAttribute(
"
strEnsure
"
, str);
然后把servlet内嵌到具体的网页中,具体嵌入就是用DreamWeaver在需要插入验证码的地方插入图像,地址就指向此servlet即可。
输入验证码并提交后,在新的页面中可以按如下方法判断:
<
body
>
<%
//
session的默认存在时间为20分钟,如果20分钟不输入验证码,session将会消失,因此要做下判断
if
(session.getAttribute(
"
strEnsure
"
)
==
null
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
%>
< jsp:forward page = " ImageErr.jsp " />
<%
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
}
else
...
{
// 获取在session中保存的生成验证码的数字
String ensure = (String)session.getAttribute( " strEnsure " );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 获取在页面的表单中输入的验证码
String code = request.getParameter( " txtimage " );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 判断输入的验证码,跟保存的生成的验证码是否一样
if (ensure.equals(code) && code != null )
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
... {
%>
< jsp:forward page = " searchword?method=add " />
<%
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
} else ... {
%>
< jsp:forward page = " ImageErr.jsp " />
<%
}
}
%>
</
body
>