验证码实现方式总结

验证码实现方式:


一.js实现验证码:


第一步:建一个login.htm,一个code.js文件,一个code.css文件,准备一张图片code.jpg


第二步:编写login.htm文件,内容为:

[html]  view plain copy
  1. <html>  
  2. <head>  
  3. <script language = "javascript" src = "code.js"></script>  
  4. <link rel="stylesheet" type="text/css" href="code.css">  
  5. </head>  
  6. <body onload="createCode();">  
  7. <form>  
  8.  <center>验证码:<input type="text" id="input1" />  
  9. <input type="text" id="checkCode" class="code" style="width: 55px" /> <a href="#" onclick="createCode()">看不清楚</a>  
  10. <input id="Button1" onclick="validate();" type="button" value="确定" /></center>  
  11. </form>  
  12. </body>  
  13. </html>  


第三步:编写code.css文件,内容为:

[html]  view plain copy
  1. .code{  
  2. background-image:url(code.jpg);  
  3. font-family:Arial;  
  4. font-style:italic;  
  5. color:Red;  
  6. border:0;  
  7. padding:2px 3px;  
  8. letter-spacing:3px;  
  9. font-weight:bolder;  
  10. }  


第四步:编写code.js文件,内容为:

[html]  view plain copy
  1. var code ; //在全局 定义验证码  
  2. function createCode(){   
  3. code = "";  
  4. var codeLength = 4;//验证码的长度  
  5. var checkCode = document.getElementById("checkCode");  
  6. checkCode.value = "";  
  7.   
  8.   
  9. var selectChar = new Array(2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z');  
  10.   
  11.   
  12. for(var i=0;i<codeLength;i++) {  
  13.    var charIndex = Math.floor(Math.random()*32);  
  14.    code +=selectChar[charIndex];  
  15. }  
  16. if(code.length != codeLength){  
  17.    createCode();  
  18. }  
  19. checkCode.value = code;  
  20. }  
  21.   
  22.   
  23. function validate () {  
  24. var inputCode = document.getElementById("input1").value.toUpperCase();  
  25.   
  26.   
  27. if(inputCode.length <=0) {  
  28.    alert("请输入验证码!");  
  29.    return false;  
  30. }  
  31. else if(inputCode != code ){  
  32.    alert("验证码输入错误!");  
  33.    createCode();  
  34.    return false;  
  35. }  
  36. else {  
  37.    alert("OK");  
  38.    return true;  
  39. }  
  40.   
  41.   
  42. }  


第五步:把四个文件放到一个文件夹中,运行login.htm文件,显示结果为:


二.servlet实现验证码:


第一步:建一个动态工程check,一个check.java(servlet类),一个login.jsp文件

第二步:编写check.java文件,内容为:

[java]  view plain copy
  1. package check;  
  2. import javax.servlet.ServletException;  
  3. import javax.servlet.http.*;  
  4. import java.io.*;  
  5. import java.awt.*;  
  6. import java.awt.image.*;  
  7. import java.util.*;  
  8. import javax.imageio.*;   
  9.   
  10. /** 
  11.  * @author  yeeku.H.lee kongyeeku@163.com 
  12.  * @version  1.0 
  13.  * <br>Copyright (C), 2005-2008, yeeku.H.Lee 
  14.  * <br>This program is protected by copyright laws. 
  15.  * <br>Program Name: 
  16.  * <br>Date:  
  17.  */  
  18. public class check extends HttpServlet  
  19. {  
  20.     private Font mFont = new Font("Arial Black", Font.PLAIN, 16);  
  21.     public void init() throws ServletException  
  22.     {  
  23.         super.init();  
  24.     }  
  25.     Color getRandColor(int fc,int bc)  
  26.     {  
  27.         Random random = new Random();  
  28.         if(fc>255) fc=255;  
  29.         if(bc>255) bc=255;  
  30.         int r=fc+random.nextInt(bc-fc);  
  31.         int g=fc+random.nextInt(bc-fc);  
  32.         int b=fc+random.nextInt(bc-fc);  
  33.         return new Color(r,g,b);  
  34.     }  
  35.   
  36.     public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  
  37.     {  
  38.         response.setHeader("Pragma","No-cache");  
  39.         response.setHeader("Cache-Control","no-cache");  
  40.         response.setDateHeader("Expires"0);  
  41.         response.setContentType("image/jpeg");  
  42.           
  43.         int width=100, height=18;  
  44.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
  45.           
  46.         Graphics g = image.getGraphics();  
  47.         Random random = new Random();  
  48.         g.setColor(getRandColor(200,250));  
  49.         g.fillRect(11, width-1, height-1);  
  50.         g.setColor(new Color(102,102,102));  
  51.         g.drawRect(00, width-1, height-1);  
  52.         g.setFont(mFont);  
  53.   
  54.         g.setColor(getRandColor(160,200));  
  55.         for (int i=0;i<155;i++)  
  56.         {  
  57.             int x = random.nextInt(width - 1);  
  58.             int y = random.nextInt(height - 1);  
  59.             int xl = random.nextInt(6) + 1;  
  60.             int yl = random.nextInt(12) + 1;  
  61.             g.drawLine(x,y,x + xl,y + yl);  
  62.         }  
  63.         for (int i = 0;i < 70;i++)  
  64.         {  
  65.             int x = random.nextInt(width - 1);  
  66.             int y = random.nextInt(height - 1);  
  67.             int xl = random.nextInt(12) + 1;  
  68.             int yl = random.nextInt(6) + 1;  
  69.             g.drawLine(x,y,x - xl,y - yl);  
  70.         }  
  71.   
  72.         String sRand="";  
  73.         for (int i=0;i<6;i++)  
  74.         {  
  75.    String tmp = getRandomChar();  
  76.             sRand += tmp;  
  77.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));  
  78.          g.drawString(tmp,15*i+10,15);  
  79.         }  
  80.   
  81.         HttpSession session = request.getSession(true);  
  82.         session.setAttribute("rand",sRand);  
  83.         g.dispose();  
  84.         ImageIO.write(image, "JPEG", response.getOutputStream());  
  85.     }  
  86.     private String getRandomChar()  
  87.     {  
  88.   int rand = (int)Math.round(Math.random() * 2);  
  89.   long itmp = 0;  
  90.   char ctmp = '\u0000';  
  91.   switch (rand)  
  92.   {  
  93.    case 1:  
  94.     itmp = Math.round(Math.random() * 25 + 65);  
  95.     ctmp = (char)itmp;  
  96.     return String.valueOf(ctmp);  
  97.    case 2:  
  98.     itmp = Math.round(Math.random() * 25 + 97);  
  99.     ctmp = (char)itmp;  
  100.     return String.valueOf(ctmp);  
  101.    default :  
  102.     itmp = Math.round(Math.random() * 9);  
  103.     return String.valueOf(itmp);  
  104.   }  
  105.     }  
  106. }  


第三步:编写login.jsp文件,内容为:

[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP 'index.jsp' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!-- 
  19.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  20.     -->  
  21.     <script>  
  22.    function refresh()  
  23.    {  
  24.     document.getElementById("authImg").src='check?now=' + new Date();  
  25.    }  
  26.   </script>  
  27.   </head>  
  28.     
  29.   <body>  
  30.   <%  
  31.    
  32.     
  33.   %>  
  34.     验证码如图:<img src="check" id="authImg"/>看不清?<a href="#" onClick="refresh()">单击此处刷新</a>  
  35.   </body>  
  36. </html>  


第四步:在web.xml文件中配置代码,内容为:

[html]  view plain copy
  1. <servlet>  
  2.         <servlet-name>img</servlet-name>  
  3.         <servlet-class>check.check</servlet-class>  
  4.     </servlet>  
  5.   
  6.     <servlet-mapping>  
  7.         <servlet-name>img</servlet-name>  
  8.      <url-pattern>/check</url-pattern>  
  9.     </servlet-mapping>   


第五步:在tomcat服务器上发布项目check,运行login.jsp,运行结果为:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 动态验证码是一种常用的验证码形式,可以有效地防止机器恶意攻击。在 Java 中,我们可以通过以下步骤实现动态验证码: 1. 生成随机字符或数字,可以使用 Random 类或 Math.random() 方法。 2. 将生成的字符或数字绘制到图片上,可以使用 Java 的 Graphics2D 类来实现。 3. 将生成的验证码图片输出到客户端,可以使用 Java 的 ImageIO 类将图片输出为 PNG、JPEG 等格式。 下面是一个简单的动态验证码生成示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CaptchaServlet extends HttpServlet { private static final long serialVersionUID = 1L; private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; private static final int WIDTH = 120; private static final int HEIGHT = 40; private static final int FONT_SIZE = 20; private static final int CHAR_COUNT = 4; protected void doGet(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/png"); // 创建验证码图片 BufferedImage captchaImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g = captchaImage.createGraphics(); // 随机生成验证码 String captchaText = ""; Random random = new Random(); for (int i = 0; i < CHAR_COUNT; i++) { char c = CHARACTERS.charAt(random.nextInt(CHARACTERS.length())); captchaText += c; } // 设置背景色 g.setColor(Color.WHITE); g.fillRect(0, 0, WIDTH, HEIGHT); // 绘制字符 g.setColor(Color.BLACK); g.setFont(new Font("Arial", Font.BOLD, FONT_SIZE)); for (int i = 0; i < captchaText.length(); i++) { char c = captchaText.charAt(i); int x = (i * WIDTH / CHAR_COUNT) + (WIDTH / CHAR_COUNT - FONT_SIZE) / 2; int y = HEIGHT / 2 + FONT_SIZE / 2; g.drawString(String.valueOf(c), x, y); } // 绘制干扰线 g.setColor(Color.GRAY); for (int i = 0; i < 10; i++) { int x1 = random.nextInt(WIDTH); int y1 = random.nextInt(HEIGHT); int x2 = random.nextInt(WIDTH); int y2 = random.nextInt(HEIGHT); g.drawLine(x1, y1, x2, y2); } // 输出图片到客户端 ImageIO.write(captchaImage, "png", response.getOutputStream()); // 保存验证码到 Session request.getSession().setAttribute("captcha", captchaText); } } ``` 在上面的代码中,我们使用了 Servlet 技术,生成了一个 4 个字符的验证码图片,并将验证码保存到 Session 中,以便后续校验。你可以将上述代码复制到一个 Java 文件中,然后将其部署到一个 Web 服务器上,在浏览器中访问该 Servlet 的 URL,就可以看到生成的动态验证码了。 ### 回答2: 动态验证码是一种用于验证用户身份的安全措施,通常用于登录、注册等操作。在 Java 中,我们可以通过以下步骤实现动态验证码: 1. 生成验证码:利用随机数生成器生成一个包含数字和字母的随机字符串作为验证码,可以使用 Random 类或者 SecureRandom 类来生成随机数。 2. 将生成的验证码存储到 Session 或者数据库中,关联到用户信息。 3. 发送验证码给用户:通过短信、邮件或者其他途径将生成的验证码发送给用户。 4. 用户输入验证码:在用户登录或者注册界面,让用户输入收到的验证码。 5. 验证用户输入:将用户输入的验证码与 Session 或者数据库中存储的验证码进行比较,判断是否一致。 6. 判断验证结果:如果验证码一致,说明用户输入正确,可以继续进行后续操作;如果验证码不一致,说明用户输入错误。 总结:以上是基本的动态验证实现过程,可以根据具体的需求和场景进行一些额外的优化和安全措施,比如设置验证码有效时间、加密存储等。在 Java 中,我们可以通过使用随机数生成器和与 Session 或者数据库交互,来实现动态验证码功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值