一、前言
验证码在我们的生活中已经很常见了,任何网站,任何应用程序都会有这个功能,但为什么要有这个呢?如何做到这一点?下面的小边将带领您使用java来完成验证码的功能。
二、验证码的作用一般来说,它可以防止人们使用机器人自动批量注册,并通过特定程序的暴力破解不断登录和灌溉特定注册用户。因为验证码是一张混合了数字和符号的图片,人眼看起来很难识别,所以机器更难识别。
三、java实现
3.1 建立验证码的servlet 类:
package com.bjpowernode.drp.util.servlet;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;import javax.servlet.http.HttpSession;/** * 生成验证码功能 * @author Ares * */public class AuthImage extends HttpServlet{ private static final String CONTENT_TYPE = "text/html; charset=gb2312"; ///设置字母的大小,大小 private Font mFont = new Font("Times New Roman", Font.PLAIN, 17); public void init() throws ServletException { super.init(); } 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); } 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); //表示生成的响应是图片 response.setContentType("image/jpeg"); int width=100, height=18; BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = image.getGraphics(); Random random = new Random(); g.setColor(getRandColor(200,250)); g.fillRect(1, 1, width-1, height-1); g.setColor(new Color(102,102,102)); g.drawRect(0, 0, width-1, height-1); g.setFont(mFont); g.setColor(getRandColor(160,200)); //画随机线 for (int i=0;i<155;i++) { int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x,y,x + xl,y + yl); } ///从另一个方向画随机线 for (int i = 0;i < 70;i++) { int x = random.nextInt(width - 1); int y = random.nextInt(height - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x,y,x - xl,y - yl); } //生成随机数,并将随机数字转换为字母 String sRand=""; for (int i=0;i<6;i++) { int itmp = random.nextInt(26) + 65; char ctmp = (char)itmp; sRand += String.valueOf(ctmp); g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110))); g.drawString(String.valueOf(ctmp),15*i+10,16); } HttpSession session = request.getSession(true); session.setAttribute("rand",sRand); g.dispose(); ImageIO.write(image, "JPEG", response.getOutputStream()); } public void destroy() { } }
3.2 Web-INF文件下的web.xml配置servletttel
///servlet名和位置 <servlet> <servlet-name>AuthImage</servlet-name> <servlet-class>com.bjpowernode.drp.util.servlet.AuthImage</servlet-class> </servlet> //servlet 对那些映射起作用 <servlet-mapping> <servlet-name>AuthImage</servlet-name> <url-pattern>/servlet/login/AuthImage</url-pattern> </servlet-mapping>
3.3 前台调用Servletet
jsp代码:
<img id="img" style="cursor:pointer;" alt="验证码" src="${pageContext.request.contextPath}/servlet/login/AuthImage" onclick="changeImg()">
js:
///点击验证码变换图片function changeImg(){ var img =document.getElementById("img"); img.src="${pageContext.request.contextPath}/servlet/login/AuthImage?d="+Math.random(); return false;}
四、小结
通过这次对验证码的学习,我也有了一定的了解,提高了整个Servlet和前台代码之间的交互和数据传输。因此,我们应该在未来学习更多这些技能并总结更多。只有这样,知识才能扎实。