浏览 3898 次
锁定老帖子 主题:Java实现验证码
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-18
编写一个Servlet import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class CheckCodeServlet extends HttpServlet { private static int WIDTH = 60; private static int HEIGHT = 20; public char[] generateCheckCode() { // 定义验证码的字符表 String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char[] rands = new char[4]; for (int i = 0; i < 4; i++) { int rand = (int) (Math.random() * 36); rands[i] = chars.charAt(rand); } return rands; } public void drawRands(Graphics g, char[] rands) { g.setColor(Color.BLACK); g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18)); // 在不同的高度上输出验证码的每个字符 g.drawString("" + rands[0], 1, 17); g.drawString("" + rands[1], 16, 15); g.drawString("" + rands[2], 31, 18); g.drawString("" + rands[3], 46, 16); } public void drawBackground(Graphics g) { // 画背景 g.setColor(new Color(0xDCDCDC)); g.fillRect(0, 0, WIDTH, HEIGHT); // 随机产生120个干扰点 for (int i = 0; i < 120; i++) { int x = (int) (Math.random() * WIDTH); int y = (int) (Math.random() * HEIGHT); int red = (int) (Math.random() * 255); int green = (int) (Math.random() * 255); int blue = (int) (Math.random() * 255); g.setColor(new Color(red, green, blue)); g.drawOval(x, y, 1, 0); } } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); response.setContentType("image/jpeg"); ServletOutputStream sos = response.getOutputStream(); // 设置浏览器不缓存此图片 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 创建内存图像并获得其图形上下文 BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); // 产生随机的验证码 char[] rands = generateCheckCode(); // 产生图像 drawBackground(g); drawRands(g, rands); // 结束图像的绘制过程,完成图像 g.dispose(); // 将图像输出到客户端 ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(image, "JPEG", bos); byte[] buf = bos.toByteArray(); response.setContentLength(buf.length); sos.write(buf); bos.close(); sos.close(); // 将当前验证码存入到session中 session.setAttribute("checkCode", new String(rands)); System.out.println(session.getAttribute("checkCode")); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } 编写一个html页面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>test.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> <script type="text/javascript"> function ajaxMethod(cid){ document.getElementById(cid).setAttribute("src",null); //加上随机数的目的是为了每次都改变url 让浏览器不要加载缓存 var svalue = "/JsParserXML/servlet/CheckCodeServlet?id=" + Math.random(); document.getElementById(cid).setAttribute("src",svalue); } function colorblue(id){ document.getElementById(id).color="blue"; } function colorblack(id){ document.getElementById(id).color="black"; } </script> </head> <body> <font size="2">验证码 :</font> <img id="checkCodeImage" src="/JsParserXML/servlet/CheckCodeServlet" style="cursor:pointer" onclick="javascript:ajaxMethod('checkCodeImage');"/> <a style="cursor:pointer" onclick="javascript:ajaxMethod('checkCodeImage');"><font id="fontId" size="2"><u onmouseover="colorblue('fontId');" onmouseout="colorblack('fontId');">看不清换一个</u></font></a> </body> </html> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |