验证码的作用:通常的登录或者注册系统时,都会要求用户输入验证码,以此区别用户行为和计算机程序行为,目的是有人防止恶意注册、暴力破解密码等。
实现验证码的思路:用 server 实现随机生成数字和字母组成图片的功能,用 jsp 页面实现显示验证码和用户输入验证码的功能,再用 server 类分别获取图片和用户输入的数据,判断两个数据是否一致。
代码实现
1.编写数字、英文随机生成的 server 类,源码:
1 package com; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.image.BufferedImage; 7 import java.io.ByteArrayOutputStream; 8 import java.io.IOException; 9 import java.io.PrintWriter; 10 11 import javax.imageio.ImageIO; 12 import javax.servlet.ServletException; 13 import javax.servlet.ServletOutputStream; 14 import javax.servlet.http.HttpServlet; 15 import javax.servlet.http.HttpServletRequest; 16 import javax.servlet.http.HttpServletResponse; 17 import javax.servlet.http.HttpSession; 18 19 public class logcheck extends HttpServlet { 20 21 public logcheck() { 22 super(); 23 } 24 25 26 public void destroy() { 27 super.destroy(); 28 } 29 30 public void doGet(HttpServletRequest request, HttpServletResponse response) 31 throws ServletException, IOException { 32 33 doPost(request, response); 34 } 35 36 37 /*实现的核心代码*/ 38 public void doPost(HttpServletRequest request, HttpServletResponse response) 39 throws ServletException, IOException { 40 41 response.setContentType("image/jpeg"); 42 HttpSession session=request.getSession(); 43 int width=60; 44 int height=20; 45 46 //设置浏览器不要缓存此图片 47 response.setHeader("Pragma", "No-cache"); 48 response.setHeader("Cache-Control", "no-cache"); 49 response.setDateHeader("Expires", 0); 50 51 //创建内存图像并获得图形上下文 52 BufferedImage image=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); 53 Graphics g=image.getGraphics(); 54 55 /* 56 * 产生随机验证码 57 * 定义验证码的字符表 58 */ 59 String chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 60 char[] rands=new char[4]; 61 for(int i=0;i<4;i++){ 62 int rand=(int) (Math.random() *36); 63 rands[i]=chars.charAt(rand); 64 } 65 66 /* 67 * 产生图像 68 * 画背景 69 */ 70 g.setColor(new Color(0xDCDCDC)); 71 g.fillRect(0, 0, width, height); 72 73 /* 74 * 随机产生120个干扰点 75 */ 76 77 for(int i=0;i<120;i++){ 78 int x=(int)(Math.random()*width); 79 int y=(int)(Math.random()*height); 80 int red=(int)(Math.random()*255); 81 int green=(int)(Math.random()*255); 82 int blue=(int)(Math.random()*255); 83 g.setColor(new Color(red,green,blue)); 84 g.drawOval(x, y, 1, 0); 85 } 86 g.setColor(Color.BLACK); 87 g.setFont(new Font(null, Font.ITALIC|Font.BOLD,18)); 88 89 //在不同高度输出验证码的不同字符 90 g.drawString(""+rands[0], 1, 17); 91 g.drawString(""+rands[1], 16, 15); 92 g.drawString(""+rands[2], 31, 18); 93 g.drawString(""+rands[3], 46, 16); 94 g.dispose(); 95 96 //将图像传到客户端 97 ServletOutputStream sos=response.getOutputStream(); 98 ByteArrayOutputStream baos=new ByteArrayOutputStream(); 99 ImageIO.write(image, "JPEG", baos); 100 byte[] buffer=baos.toByteArray(); 101 response.setContentLength(buffer.length); 102 sos.write(buffer); 103 baos.close(); 104 sos.close(); 105 106 session.setAttribute("checkcode", new String(rands)); 107 } 108 109 110 public void init() throws ServletException { 111 // Put your code here 112 } 113 114 }
2.用于显示验证码的页面:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 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>index</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 </head> 22 23 <body> 24 <form action="yanzheng" method="post"> 25 <input type="text" name="name" size="5" maxlength="4"> 26 <a href="index.jsp"><img border="0" src="logcheck"></a><br><br> 27      <input type="submit" value="提交"> 28 </form> 29 </body> 30 </html>
3.用于检验输入的验证码是否正确:
1 package com; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.jms.Session; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import javax.servlet.http.HttpSession; 12 13 public class yanzheng extends HttpServlet { 14 15 public yanzheng() { 16 super(); 17 } 18 19 public void destroy() { 20 super.destroy(); 21 } 22 23 public void doGet(HttpServletRequest request, HttpServletResponse response) 24 throws ServletException, IOException { 25 26 doPost(request, response); 27 } 28 /*核心代码*/ 29 public void doPost(HttpServletRequest request, HttpServletResponse response) 30 throws ServletException, IOException { 31 32 String info=null; 33 /*获取输入的值*/ 34 String value1=request.getParameter("name"); 35 36 /*获取图片的值*/ 37 HttpSession session=request.getSession(); 38 String value2=(String)session.getAttribute("checkcode"); 39 40 /*对比两个值(字母不区分大小写)*/ 41 if(value2.equalsIgnoreCase(value1)){ 42 info="验证码输入正确"; 43 }else{ 44 info="验证码输入错误"; 45 } 46 System.out.println(info); 47 request.setAttribute("info", info); 48 request.getRequestDispatcher("/login.jsp").forward(request, response); 49 } 50 51 52 public void init() throws ServletException { 53 // Put your code here 54 } 55 56 }
4.显示输入结构界面(输入验证码是否正确):
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 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 'login.jsp' starting page</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 <!-- 20 <link rel="stylesheet" type="text/css" href="styles.css"> 21 --> 22 23 </head> 24 25 <body> 26 <%=request.getAttribute("info") %> 27 </body> 28 </html>
5.项目结构、效果截图: