利用servlet技术实现验证码功能
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %> 2 3 <% 4 String action = request.getParameter("action"); 5 String safecodeText = request.getParameter("safecodeTest"); 6 if("action".equals(action)){ 7 String safecode = (String)session.getAttribute("safecode"); 8 if(safecode.equals(safecodeText)){ 9 out.print("验证码正确!"); 10 }else{ 11 out.print("验证码错误!请重新输入!"); 12 } 13 } 14 %> 15 <html> 16 <head> 17 <title>验证码测试</title> 18 </head> 19 20 <body> 21 <form action="servlet/demo" method="post"> 22 <input type="hidden" name="action" value="action"/> 23 <img alt="验证码" src="servlet/demo"> 24 <input type="text" name="safecodeTest"> 25 <input type="submit" value="go"> 26 </form> 27 </body> 28 </html>
1 import java.io.*; 2 3 import javax.servlet.*; 4 import javax.servlet.http.*; 5 import java.util.Random; 6 import java.awt.*; 7 import java.awt.image.*; 8 import javax.imageio.*; 9 10 11 public class demo extends HttpServlet { 12 //产生随即的字体 13 private Font getFont() { 14 Random random = new Random(); 15 Font font[] = new Font[5]; 16 font[0] = new Font("Ravie", Font.PLAIN, 24); 17 font[1] = new Font("Antique Olive Compact", Font.PLAIN, 24); 18 font[2] = new Font("Forte", Font.PLAIN, 24); 19 font[3] = new Font("Wide Latin", Font.PLAIN, 24); 20 font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, 24); 21 return font[random.nextInt(5)]; 22 } 23 24 protected void doGet(HttpServletRequest req, HttpServletResponse resp) 25 throws ServletException, IOException { 26 // 设置响应头 Content-type类型 27 resp.setContentType("image/jpeg"); 28 // 以下三句是用于设置页面不缓存 29 resp.setHeader("Pragma", "No-cache"); 30 resp.setHeader("Cache-Control", "No-cache"); 31 resp.setDateHeader("Expires", 0); 32 33 OutputStream os = resp.getOutputStream(); 34 int width = 83, height = 30; 35 // 建立指定宽、高和BufferedImage对象 36 BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); 37 38 Graphics g = image.getGraphics(); // 该画笔画在image上 39 Color c = g.getColor(); // 保存当前画笔的颜色,用完画笔后要回复现场 40 g.fillRect(0, 0, width, height); 41 42 43 char[] ch = "abcdefghjkmnpqrstuvwxyz23456789".toCharArray(); // 随即产生的字符串 不包括 i l(小写L) o(小写O) 1(数字1)0(数字0) 44 int length = ch.length; // 随即字符串的长度 45 String sRand = ""; // 保存随即产生的字符串 46 Random random = new Random(); 47 for (int i = 0; i < 4; i++) { 48 // 设置字体 49 g.setFont(getFont()); 50 // 随即生成0-9的数字 51 String rand = new Character(ch[random.nextInt(length)]).toString(); 52 sRand += rand; 53 // 设置随机颜色 54 g.setColor(new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255))); 55 g.drawString(rand, 20 * i + 6, 25); 56 } 57 //产生随即干扰点 58 for (int i = 0; i < 20; i++) { 59 int x1 = random.nextInt(width); 60 int y1 = random.nextInt(height); 61 g.drawOval(x1, y1, 2, 2); 62 } 63 g.setColor(c); // 将画笔的颜色再设置回去 64 g.dispose(); 65 66 //将验证码记录到session 67 req.getSession().setAttribute("safecode", sRand); 68 // 输出图像到页面 69 ImageIO.write(image, "JPEG", os); 70 71 } 72 73 protected void doPost(HttpServletRequest req, HttpServletResponse resp) 74 throws ServletException, IOException { 75 doGet(req, resp); 76 } 77 78 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 3 <display-name>JavaWebDemo</display-name> 4 <servlet> 5 <description>This is the description of my J2EE component</description> 6 <display-name>This is the display name of my J2EE component</display-name> 7 <servlet-name>demo</servlet-name> 8 <servlet-class>demo</servlet-class> 9 </servlet> 10 11 <servlet-mapping> 12 <servlet-name>demo</servlet-name> 13 <url-pattern>/servlet/demo</url-pattern> 14 </servlet-mapping> 15 16 <welcome-file-list> 17 <welcome-file>index.html</welcome-file> 18 <welcome-file>index.htm</welcome-file> 19 <welcome-file>index.jsp</welcome-file> 20 <welcome-file>default.html</welcome-file> 21 <welcome-file>default.htm</welcome-file> 22 <welcome-file>default.jsp</welcome-file> 23 </welcome-file-list> 24 </web-app>
1 package action; 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.ByteArrayInputStream; 8 import java.io.ByteArrayOutputStream; 9 import java.util.Map; 10 11 import javax.imageio.ImageIO; 12 import javax.imageio.stream.ImageOutputStream; 13 14 import com.opensymphony.xwork2.ActionContext; 15 import com.opensymphony.xwork2.ActionSupport; 16 17 public class ImageAction extends ActionSupport { 18 19 /** 20 * 21 */ 22 private static final long serialVersionUID = 1L; 23 private ByteArrayInputStream inputStream; 24 public String createRandomString(){ 25 String str=""; 26 for(int i=0;i<4;i++){ 27 str+=Integer.toString((new Double(Math.random()*10)).intValue()); 28 } 29 return str; 30 } 31 public Color createRandomColor(){ 32 int r=(new Double(Math.random()*256)).intValue(); 33 int g=(new Double(Math.random()*256)).intValue(); 34 int b=(new Double(Math.random()*256)).intValue(); 35 return new Color(r,g,b); 36 } 37 public BufferedImage createImage(String str){ 38 int width=60; 39 int height=22; 40 BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 41 Graphics g=image.getGraphics(); 42 g.setColor(Color.WHITE); 43 g.fillRect(0, 0, width, height); 44 g.setColor(Color.BLACK); 45 g.drawRect(0, 0, width-1, height-1); 46 g.setFont(new Font("Atlantic Inline",Font.PLAIN,18)); 47 g.setColor(this.createRandomColor()); 48 g.drawString(Character.toString(str.charAt(0)), 8, 17); 49 g.drawString(Character.toString(str.charAt(1)), 20, 17); 50 g.drawString(Character.toString(str.charAt(2)), 33, 17); 51 g.drawString(Character.toString(str.charAt(3)), 45, 17); 52 g.dispose(); 53 return image; 54 } 55 public ByteArrayInputStream createInputStream() throws Exception{ 56 String str=this.createRandomString(); 57 BufferedImage image=this.createImage(str); 58 ActionContext actioncontext=ActionContext.getContext(); 59 Map session=actioncontext.getSession(); 60 session.put("random", str); 61 ByteArrayOutputStream output=new ByteArrayOutputStream(); 62 ImageOutputStream imageout=ImageIO.createImageOutputStream(output); 63 ImageIO.write(image, "JPEG", imageout); 64 imageout.close(); 65 ByteArrayInputStream input=new ByteArrayInputStream(output.toByteArray()); 66 output.close(); 67 return input; 68 } 69 public String execute() throws Exception{ 70 setInputStream(createInputStream()); 71 return SUCCESS; 72 } 73 public ByteArrayInputStream getInputStream(){ 74 return inputStream; 75 } 76 public void setInputStream(ByteArrayInputStream inputStream){ 77 this.inputStream=inputStream; 78 } 79 }