我们可以先定义一个servlet:因为我们要把生成都验证码保存到session里面,在servlet里面较方便当然也可以在jsp里面生成。
package com.zchen.util; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.awt.*; import java.awt.image.*; import java.util.*; import javax.imageio.*; public class AuthImg extends HttpServlet { //定义图形验证码中绘制字符的字体 private final Font mFont = new Font("Arial Black", Font.PLAIN, 16); //定义图形验证码的大小 private final int IMG_WIDTH = 100; private final int IMG_HEIGTH = 18; //定义一个获取随机颜色的方法 private Color getRandColor(int fc,int bc) { Random random = new Random(); if(fc > 255) fc = 255; if(bc > 255) bc=255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); //得到随机颜色 return new Color(r , g , b); } //重写service方法,生成对客户端的响应 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置禁止缓存 response.setHeader("Pragma","No-cache"); response.setHeader("Cache-Control","no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); BufferedImage image = new BufferedImage (IMG_WIDTH , IMG_HEIGTH , BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200 , 250)); //填充背景色 g.fillRect(1, 1, IMG_WIDTH - 1, IMG_HEIGTH - 1); //为图形验证码绘制边框 g.setColor(new Color(102 , 102 , 102)); g.drawRect(0, 0, IMG_WIDTH - 1, IMG_HEIGTH - 1); g.setColor(getRandColor(160,200)); //生成随机干扰线 for (int i = 0 ; i < 80 ; i++) { int x = random.nextInt(IMG_WIDTH - 1); int y = random.nextInt(IMG_HEIGTH - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x , y , x + xl , y + yl); } g.setColor(getRandColor(160,200)); //生成随机干扰线 for (int i = 0 ; i < 80 ; i++) { int x = random.nextInt(IMG_WIDTH - 1); int y = random.nextInt(IMG_HEIGTH - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x , y , x - xl , y - yl); } //设置绘制字符的字体 g.setFont(mFont); //用于保存系统生成的随机字符串 String sRand = ""; for (int i = 0 ; i < 6 ; i++) { String tmp = getRandomChar(); sRand += tmp; //获取随机颜色 g.setColor(new Color(20 + random.nextInt(110) ,20 + random.nextInt(110) ,20 + random.nextInt(110))); //在图片上绘制系统生成的随机字符 g.drawString(tmp , 15 * i + 10,15); } //获取HttpSesssion对象 HttpSession session = request.getSession(true); //将随机字符串放入HttpSesssion对象中 session.setAttribute("rand" , sRand); g.dispose(); //向输出流中输出图片 ImageIO.write(image, "JPEG", response.getOutputStream()); } //定义获取随机字符串方法 private String getRandomChar() { //生成一个0、1、2的随机数字 int rand = (int)Math.round(Math.random() * 2); long itmp = 0; char ctmp = '\u0000'; switch (rand) { //生成大写字母 case 1: itmp = Math.round(Math.random() * 25 + 65); ctmp = (char)itmp; return String.valueOf(ctmp); //生成小写字母 case 2: itmp = Math.round(Math.random() * 25 + 97); ctmp = (char)itmp; return String.valueOf(ctmp); //生成数字 default : itmp = Math.round(Math.random() * 9); return itmp + ""; } } }
2.创建一个jsp文件定义一个表单。
<body> <form action="servlet/YanZheng" method="post"> 验证码:<input type="text" name="yanzhengma"> <img name="d" src="<%=basePath %>/servlet/AuthImg"> <input type="submit"> </form> </body> </body>
说明:input标签就是我们输入的验证码。<img >标签就是servlet自动帮我们生成的图形验证码。
但我们怎么讲验证码显示出来呢?
当创建AuthImg servlet的时候eclipse会自动帮我们在web.xml文件中配置映射路径所以<img src="--">就是这个路径。
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>AuthImg</servlet-name> <servlet-class>com.zchen.util.AuthImg</servlet-class> </servlet> <servlet> <servlet-name>YanZheng</servlet-name> <servlet-class>com.zchen.util.YanZheng</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthImg</servlet-name> <url-pattern>/servlet/AuthImg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>YanZheng</servlet-name> <url-pattern>/servlet/YanZheng</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>/index.jsp</welcome-file> </welcome-file-list> </web-app>
3.在YanZheng servlet里面取值:
1>取得自动生成的图形码:(String)request.getSession().getAttribute("rand");
2>取得我们输入的验证码:(String)request.getParameter("yanzhengma");
判断即可;