Java 验证码

来源:互联网 发布:飞利浦剃须刀推荐 知乎 编辑:程序博客网 时间:2024/06/15 02:01

下面的例子是用Servlet生成的一个验证码,例子是模拟登陆。

login.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>验证码</title></head><body><form action="${pageContext.request.contextPath }/servlet/LoginServlet"><table border="0" cellspacing="0" cellpadding="0" width="50%"><tr><td width="20%" align="right">用户名:</td><td colspan="2"><input type="text" name="username" value="" size="34"/></td></tr><tr><td width="20%" align="right">密 码:</td><td colspan="2"><input type="password" name="password" value="" size="35"/></td></tr><tr><td width="20%" align="right">验证码:</td><td width="21%"><input type="text" name="code" value="" size="15"/></td><td align="left"><img src="${pageContext.request.contextPath }/servlet/ImageCodeMakerServlet" width="100px" height="30" /></td></tr></table></form></body></html>

在web.xml中

<servlet>  <servlet-name>login</servlet-name>  <servlet-class>com.web.LoginServlet</servlet-class>  </servlet>  <servlet>  <servlet-name>imageCodeMakerServlet</servlet-name>  <servlet-class>com.web.ImageCodeMakerServlet</servlet-class>  </servlet>  <servlet-mapping>  <servlet-name>login</servlet-name>  <url-pattern>/servlet/LoginServlet</url-pattern>  </servlet-mapping>  <servlet-mapping><servlet-name>imageCodeMakerServlet</servlet-name><url-pattern>/servlet/ImageCodeMakerServlet</url-pattern>  </servlet-mapping>


在后台Servlet里

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");String code = request.getParameter("code");// 页面,用户输入的验证码HttpSession session = request.getSession();String randCode = (String)session.getAttribute("randCode");// 得到系统生成的验证码if(randCode.equals(code)){// 验证码输入正确System.out.println("验证码输入正确");}else{System.out.println("验证码不正确");}}}


ImageCodeMakerServlet如下

import java.awt.Color;import java.awt.Font;import java.awt.Graphics;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 ImageCodeMakerServlet extends HttpServlet {public ImageCodeMakerServlet() {super();}public void destroy() {super.destroy(); }public void service(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 首先设置页面不缓存response.setHeader("Pragma", "No-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);// 定义图片的宽度和高度int width = 90, height = 40;// 创建一个图像对象BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 得到图像的环境对象Graphics g = image.createGraphics();Random random = new Random();// 用随机颜色填充图像背景g.setColor(getRandColor(180, 250));g.fillRect(0, 0, width, height);for (int i = 0; i < 5; i++) {g.setColor(getRandColor(50, 100));int x = random.nextInt(width);int y = random.nextInt(height);g.drawOval(x, y, 4, 4);}// 设置字体,下面准备画随机数g.setFont(new Font("", Font.PLAIN, 40));// 随机数字符串String sRand = "";for (int i = 0; i < 4; i++) {// 生成四个数字字符String rand = String.valueOf(random.nextInt(10));sRand += rand;// 生成随机颜色g.setColor(new Color(20 + random.nextInt(80), 20 + random.nextInt(100), 20 + random.nextInt(90)));// 将随机数字画在图像上g.drawString(rand, (17 + random.nextInt(3)) * i + 8, 34);// 生成干扰线for (int k = 0; k < 12; k++) {int x = random.nextInt(width);int y = random.nextInt(height);int xl = random.nextInt(9);int yl = random.nextInt(9);g.drawLine(x, y, x + xl, y + yl);}}// 将生成的随机数字字符串写入Sessionrequest.getSession(false).setAttribute("randcode", sRand);// 使图像生效g.dispose();// 输出图像到页面ImageIO.write(image, "JPEG", response.getOutputStream());}/** * Initialization of the servlet. <br> *  * @throws ServletException *             if an error occurs */public void init() throws ServletException {// Put your code here}/** * 产生一个随机的颜色 *  * @param fc *            颜色分量最小值 * @param bc *            颜色分量最大值 * @return */public Color getRandColor(int fc, int bc) {Random random = new Random();if (fc > 255){fc = 255;}if (bc > 255){bc = 255;}int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}}