现在许多系统的注册登录或者发布信息模块都添加的随机码功能就是为了避免自动注册程序或者自动发布程序的使用
验证码实际上就是随机选择一些字符以图片的形式展现在页面上如果进行提交操作的同时需要将图片上的字符同时提交如果提交的字符与服务器session保存的不同则认为提交信息无效为了避免自动程序分析解析图片通常会在图片上随机生成一些干扰线或者将字符进行扭曲增加自动识别的难度
在这里我们使用servlet来实现随机验证码的实现
package comservlet;import javaawtColor;import javaawtFont;import javaawtGraphicsD;import javaawtimageBufferedImage;import javautilRandom;import javaximageioImageIO;import javaxservletServletException;import javaxservletServletOutputStream;import javaxservletimport javaxservletimport javaxservletimport javaxservlet/** * 生成随机验证码 * @author bitiliu * */public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = L; //验证码图片的宽度 private int width=; //验证码图片的高度 private int height=; //验证码字符个数 private int codeCount=; private int x=; //字体高度 private int fontHeight; private int codeY; char[] codeSequence = { A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }; /** * 初始化验证图片属性 */ public void init() throws ServletException { //从webxml中获取初始信息 //宽度 String strWidth=thisgetInitParameter("width"); //高度 String strHeight=thisgetInitParameter("height"); //字符个数 String strCodeCount=thisgetInitParameter("codeCount"); //将配置的信息转换成数值 try { if(strWidth!=null && strWidthlength()!=) { width=IntegerparseInt(strWidth); } if(strHeight!=null && strHeightlength()!=) { height=IntegerparseInt(strHeight); } if(strCodeCount!=null && strCodeCountlength()!=) { codeCount=IntegerparseInt(strCodeCount); } } catch(NumberFormatException e) {} x=width/(codeCount+); fontHeight=height; codeY=height; } protected void service(HttpServletRequest req HttpServletResponse resp) throws ServletException javaioIOException { //定义图像buffer BufferedImage buffImg = new BufferedImage(width heightBufferedImageTYPE_INT_RGB); GraphicsD g = buffImgcreateGraphics(); //创建一个随机数生成器类 Random random = new Random(); //将图像填充为白色 gsetColor(ColorWHITE); gfillRect( width height); //创建字体字体的大小应该根据图片的高度来定 Font font = new Font("Fixedsys" FontPLAIN fontHeight); //设置字体 gsetFont(font); //画边框 gsetColor(ColorBLACK); gdrawRect( width height ); //随机产生条干扰线使图象中的认证码不易被其它程序探测到 gsetColor(ColorBLACK); for(int i = ; i < ; i++) { int x = randomnextInt(width); int y = randomnextInt(height); int xl = randomnextInt(); int yl = randomnextInt(); gdrawLine(x y x + xl y + yl); } //randomCode用于保存随机产生的验证码以便用户登录后进行验证 StringBuffer randomCode = new StringBuffer(); int red = green = blue = ; //随机产生codeCount数字的验证码 for (int i = ; i < codeCount; i++) { //得到随机产生的验证码数字 String strRand = StringvalueOf(codeSequence[randomnextInt()]); //产生随机的颜色分量来构造颜色值这样输出的每位数字的颜色值都将不同 red = randomnextInt(); green = randomnextInt(); blue = randomnextInt(); //用随机产生的颜色将验证码绘制到图像中 gsetColor(new Color(red green blue)); gdrawString(strRand (i + ) * x codeY); //将产生的四个随机数组合在一起 randomCodeappend(strRand); } // 将四位数字的验证码保存到Session中 HttpSession session = reqgetSession(); sessionsetAttribute("validateCode" randomCodetoString()); // 禁止图像缓存 respsetHeader("Pragma" "nocache"); respsetHeader("CacheControl" "nocache"); respsetDateHeader("Expires" ); respsetContentType("image/jpeg"); //将图像输出到Servlet输出流中 ServletOutputStream sos = respgetOutputStream(); ImageIOwrite(buffImg "jpeg" sos); sosclose(); }}
需要在webxml中声明servlet
<servlet> <servletname>ValidateCodeServlet</servletname> <servletclass>comservletValidateCodeServlet</servletclass> <initparam> <paramname>width</paramname> <paramvalue></paramvalue> </initparam> <initparam> <paramname>height</paramname> <paramvalue></paramvalue> </initparam> <initparam> <paramname>codeCount</paramname> <paramvalue></paramvalue> </initparam> </servlet> <servletmapping> <servletname>ValidateCodeServlet</servletname> <urlpattern>/validateCodeServlet</urlpattern> </servletmapping>
需要引用的页面可以这样来写
<ccid_file values="validateCodeServlet" width="/" />
用户提交后就可以将用户输入的验证码与session中保存的字符串进行比对达到验证的效果