点击“看不清换一张”
测试用例:
Index.jsp
<%@ page contentType="text/html; charset=utf-8" language="java" import="java.util.*" errorPage=""%> <HTML> <head> <title>测试</title> </head> <BODY id="body"> <form> <img border=0 src="ImageMaskServlet" width="40" height="16" id = "imageMask"> <a href = "#" style = "font-size: 13px;margin-left: 5px;" onclick = "myReload()">看不清换一张</a> </form> <script type="text/javascript"> //用于刷新验证码 function myReload(){ document.getElementById("imageMask").src=document.getElementById("imageMask").src+"?nocache="+new Date().getTime(); } </script> </BODY> </HTML>
ImageMaskServlet
package javaServlet; 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 ImageMaskServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); int width = 60, height = 20; //创建图象 BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB); //获取图形上下文 Graphics graphics = image.getGraphics(); //生成随机类 Random random = new Random(); //设定背景色 graphics.setColor(getRandColor(200, 250)); //验证码大小 graphics.fillRect(0, 0, width, height); //设置字体 graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18)); //graphics.setColor(getRandColor(160, 200)); //随机产生155条干扰线,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); graphics.drawLine(x, y, x + xl, y + yl); } //取随机产生的认证码(4位数字) String sRand = ""; for (int i = 0; i < 4; i++) { //0~9 String rand = String.valueOf(random.nextInt(10)); sRand += rand; //设置数字颜色 graphics.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); //把随机产生的4位数画在图片上 graphics.drawString(rand, 13 * i + 6, 16); } //放在session中 request.getSession().setAttribute("imageMask", sRand); //图象生效 graphics.dispose(); //输出图象到页面 ImageIO.write(image, "JPEG", response.getOutputStream()); } //生成随机颜色 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); } }