java实现验证码完整版

来源:互联网 发布:haproxy和nginx的区别 编辑:程序博客网 时间:2024/05/18 19:36

第一步:在web.xml中配置servlet

    <servlet>          <servlet-name>ImageServlet</servlet-name>          <servlet-class>org.servlet.ImageServlet</servlet-class>      </servlet>      <servlet-mapping>          <servlet-name>ImageServlet</servlet-name>          <url-pattern>/ImageServlet</url-pattern>      </servlet-mapping>  

第二步: ImageServlet 实现
    import javax.servlet.ServletException;      import javax.servlet.http.HttpServlet;      import javax.servlet.http.HttpServletRequest;      import javax.servlet.http.HttpServletResponse;            import com.farm.web.tool.RandomValidateCode;            public class ImageServlet extends HttpServlet {                private static final long serialVersionUID = 1L;                public void doGet(HttpServletRequest request, HttpServletResponse response)                  throws ServletException, IOException {                    response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片              response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容              response.setHeader("Cache-Control", "no-cache");              response.setDateHeader("Expire", 0);              RandomValidateCode randomValidateCode = new RandomValidateCode();              try {                  randomValidateCode.getRandcode(request, response);// 输出图片方法              } catch (Exception e) {                  e.printStackTrace();              }          }                public void doPost(HttpServletRequest request, HttpServletResponse response)                  throws ServletException, IOException {              doGet(request, response);          }            }  

    import java.awt.Color;      import java.awt.Font;      import java.awt.Graphics;      import java.awt.image.BufferedImage;      import java.util.Random;            import javax.imageio.ImageIO;      import javax.servlet.http.HttpServletRequest;      import javax.servlet.http.HttpServletResponse;      import javax.servlet.http.HttpSession;            public class RandomValidateCode {                public static String validateCode = null;          public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key          private Random random = new Random();          private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串                private int width = 80;// 图片宽          private int height = 26;// 图片高          private int lineSize = 40;// 干扰线数量          private int stringNum = 4;// 随机产生字符数量                /*          * 获得字体          */          private Font getFont() {              return new Font("Fixedsys", Font.CENTER_BASELINE, 18);          }                /*          * 获得颜色          */          private Color getRandColor(int fc, int bc) {              if (fc > 255)                  fc = 255;              if (bc > 255)                  bc = 255;              int r = fc + random.nextInt(bc - fc - 16);              int g = fc + random.nextInt(bc - fc - 14);              int b = fc + random.nextInt(bc - fc - 18);              return new Color(r, g, b);          }                /**          * 生成随机图片          */          public void getRandcode(HttpServletRequest request,                  HttpServletResponse response) {              HttpSession session = request.getSession();              // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类              BufferedImage image = new BufferedImage(width, height,                      BufferedImage.TYPE_INT_BGR);              Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作              g.fillRect(0, 0, width, height);              g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));              g.setColor(getRandColor(110, 133));              // 绘制干扰线              for (int i = 0; i <= lineSize; i++) {                  drowLine(g);              }              // 绘制随机字符              String randomString = "";              for (int i = 1; i <= stringNum; i++) {                  randomString = drowString(g, randomString, i);              }              session.removeAttribute(RANDOMCODEKEY);              session.setAttribute(RANDOMCODEKEY, randomString);              validateCode = randomString.toUpperCase();              g.dispose();              try {                  ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端              } catch (Exception e) {                  e.printStackTrace();              }          }                /*          * 绘制字符串          */          private String drowString(Graphics g, String randomString, int i) {              g.setFont(getFont());              g.setColor(new Color(random.nextInt(101), random.nextInt(111), random                      .nextInt(121)));              String rand = String.valueOf(getRandomString(random.nextInt(randString                      .length())));              randomString += rand;              g.translate(random.nextInt(3), random.nextInt(3));              g.drawString(rand, 13 * i, 16);              return randomString;          }                /*          * 绘制干扰线          */          private void drowLine(Graphics g) {              int x = random.nextInt(width);              int y = random.nextInt(height);              int xl = random.nextInt(13);              int yl = random.nextInt(15);              g.drawLine(x, y, x + xl, y + yl);          }                /*          * 获取随机的字符          */          public String getRandomString(int num) {              return String.valueOf(randString.charAt(num));          }      }  


第三步:jsp展现
    <tr>          <td>              <div align="right">                  验证码:              </div>          </td>          <td>              <input style="width: 65px" id="validatecode" name="validatecode" type="text" />          </td>          <td>              <img title="看不清楚,换一张?" style="cursor: pointer;"                  onclick="javascript:refresh(this);"                  src="<PF:basePath/>/ImageServlet">          </td>      </tr>  

src路径根据情况修改
    function refresh(obj) {          obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();        }  

第四步:Action验证
if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCase().equals(RandomValidateCode.validateCode)){      System.out.println("验证码正确");  }  
0 0
原创粉丝点击