验证码大家都知道,它的作用也不用我多说了吧。如果不太清楚请参见百度百科中的解释,一般验证码的生成就是随机产生字符(数字、字母或者汉字等),然后将这些生成的字符绘制成一张图片,再在图片上加上一些干扰元素,如各种线条之类的。好了废话不多说一起往下看:

)——简单验证码生成(Java版) _汉字



简单的登录页面(代码并不完整,只有验证码部分)
  1. <%@ page language="java"import="java.util.*"pageEncoding="UTF-8"%>

  2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

  3. <html>

  4. <head>

  5. <title>验证码</title>

  6. <scripttype="text/javascript">

  7. <spanstyle="white-space: pre;"></span><spanstyle="white-space: pre;"></span> //刷新验证码的js函数    

  8. <spanstyle="white-space: pre;"></span>function changeCode() {    

  9. <spanstyle="white-space: pre;"></span>var imgNode = document.getElementById("vimg");                    

  10. <spanstyle="white-space: pre;"></span>//重新加载验证码,达到刷新的目的    

  11. <spanstyle="white-space: pre;"></span>imgNode.src = "servlet/AuthImageServlet?t=" + Math.random();  // 防止浏览器缓存的问题       

  12. <spanstyle="white-space: pre;"></span>}      

  13. </script>

  14. </head>

  15. <body>

  16. <formaction="checkServlet"method="post">

  17. <label>输入验证码</label><br/>

  18. <inputtype="text"name="randomCode"/><imgid="vimg"title="点击更换"onclick="changeCode();"src="servlet/AuthImageServlet"><br/>

  19. <inputtype="submit"value="submit">

  20. </form>

  21. </body>

  22. </html>

通过session.getAttribute("rand"),获得生成的验证码,然后跟用户输入的进行比较,再根据比较结果做相应的处理。

 

通过servlet生成验证码:

 

  1. package com.util.servlet;  

  2. import java.awt.Color;  

  3. import java.awt.Font;  

  4. import java.awt.Graphics;  

  5. import java.awt.p_w_picpath.BufferedImage;  

  6. import java.io.IOException;  

  7. import java.util.Random;  

  8. import javax.p_w_picpathio.ImageIO;  

  9. import javax.servlet.ServletException;  

  10. import javax.servlet.http.HttpServlet;  

  11. import javax.servlet.http.HttpServletRequest;  

  12. import javax.servlet.http.HttpServletResponse;  

  13. import javax.servlet.http.HttpSession;  

  14. publicclass AuthImageServlet extends HttpServlet {  

  15. privatestaticfinal String CONTENT_TYPE = "text/html; charset=gb2312";     

  16. //设置字母的大小,大小   

  17. private Font mFont = new Font("Times New Roman", Font.PLAIN, 17);     

  18. publicvoid init() throws ServletException     

  19.     {     

  20. super.init();     

  21.     }     

  22.     Color getRandColor(int fc,int bc)     

  23.     {     

  24.         Random random = new Random();     

  25. if(fc>255) fc=255;     

  26. if(bc>255) bc=255;     

  27. int r=fc+random.nextInt(bc-fc);     

  28. int g=fc+random.nextInt(bc-fc);     

  29. int b=fc+random.nextInt(bc-fc);     

  30. returnnew Color(r,g,b);     

  31.     }     

  32. publicvoid service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException     

  33.     {     

  34.         response.setHeader("Pragma","No-cache");     

  35.         response.setHeader("Cache-Control","no-cache");     

  36.         response.setDateHeader("Expires"0);     

  37. //表明生成的响应是图片   

  38.         response.setContentType("p_w_picpath/jpeg");     

  39. int width=100, height=18;     

  40.         BufferedImage p_w_picpath = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);     

  41.         Graphics g = p_w_picpath.getGraphics();     

  42.         Random random = new Random();     

  43.         g.setColor(getRandColor(200,250));     

  44.         g.fillRect(11, width-1, height-1);     

  45.         g.setColor(new Color(102,102,102));     

  46.         g.drawRect(00, width-1, height-1);     

  47.         g.setFont(mFont);     

  48.         g.setColor(getRandColor(160,200));     

  49. //画随机线   

  50. for (int i=0;i<155;i++)     

  51.         {     

  52. int x = random.nextInt(width - 1);     

  53. int y = random.nextInt(height - 1);     

  54. int xl = random.nextInt(6) + 1;     

  55. int yl = random.nextInt(12) + 1;     

  56.             g.drawLine(x,y,x + xl,y + yl);     

  57.         }     

  58. //从另一方向画随机线   

  59. for (int i = 0;i < 70;i++)     

  60.         {     

  61. int x = random.nextInt(width - 1);     

  62. int y = random.nextInt(height - 1);     

  63. int xl = random.nextInt(12) + 1;     

  64. int yl = random.nextInt(6) + 1;     

  65.             g.drawLine(x,y,x - xl,y - yl);     

  66.         }     

  67. //生成随机数,并将随机数字转换为字母   

  68.         String sRand="";     

  69. for (int i=0;i<6;i++)     

  70.         {     

  71. int itmp = random.nextInt(26) + 65;     

  72. char ctmp = (char)itmp;     

  73.             sRand += String.valueOf(ctmp);     

  74.             g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));     

  75.             g.drawString(String.valueOf(ctmp),15*i+10,16);     

  76.         }     

  77.         HttpSession session = request.getSession(true);     

  78.         session.setAttribute("rand",sRand);     

  79.         g.dispose();     

  80.         ImageIO.write(p_w_picpath, "JPEG", response.getOutputStream());     

  81.     }     

  82. }  



web.xml中的servlet配置信息:
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <web-appversion="2.5"

  3. xmlns="http://java.sun.com/xml/ns/javaee"

  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   

  6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

  7. <servlet>

  8. <servlet-name>AuthImageServlet</servlet-name>

  9. <servlet-class>com.util.servlet.AuthImageServlet</servlet-class>

  10. </servlet>

  11. <servlet-mapping>

  12. <servlet-name>AuthImageServlet</servlet-name>

  13. <url-pattern>/servlet/AuthImageServlet</url-pattern>

  14. </servlet-mapping>

  15. <welcome-file-list>

  16. <welcome-file>index.jsp</welcome-file>

  17. </welcome-file-list>

  18. </web-app>


就这样验证码的功能就实现了,很简单、很实用。当然还有更加美观,更加严密的方式,有兴趣的朋友可以深入研究。这里就跟大家分享一个比较简单的方式。欢迎各位批评指正