通过servlet 实现图片验证码功能,分3步实现:
import javax.servlet.http.servlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletException; import javax.servlet.ServletOutputStream; import java.io.Exception; import java.util.Randow; import java.awt.Color; import java.awt.Image.BufferImage; import java.awt.Graphics2D; import com.sun.image.codec.jpeg.JPEGImageEncoder; import com.sun.image.codec.jpeg.JPEGCodec; /** 通过servlet实现验证码功能 */ public class CodeServlet extends HttpServlet{ //声明字符数组常量,随机数从此常量中获取(去除了些常见的容易产生歧义的字符如'1','l','0','o'等) publis static final char[] CHARS= {'2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','g','k','m','n','p','q','r','s','t','u','v','w','x','z'} public static Randow randow = new Randow();//声明随机数 //获取4位的随机数 public static String getRandow(){ StringBuffer buffer= new StringBuffer(); for(int i=0; i<4; i++){ buffer.append(CHARS[randow.nextInt(CHARS.length())]); } return buffer.toString(); } //获取随机颜色 public static Color getColor(){ return new Color(radow.nextInt(255),radow.nextInt(255),radow.nextInt(255)); } //获取随机颜色反色 public static Color getReverseColor(Color c){ return new Color(255-c.getRed(), 255-c.getGreen(), 255-c.getBlue()); } public void doGet(HttpServletRequst request, HttpServletResponse response) throws HttpServletException,IOException{ //设置相应类型,此处相应类型为图片,HTML文本为(text/html) response.setContentType("image/jpeg"); //request.setCharacterEncoding = "UTF-8"; //设置请求的编码格式 //response.setCharacterEncoding = "UTF-8"; //设置响应的编码格式 String rdmString = getRandom(); //设置Session以便与前台输入的随机数对比 request.getSession().setAttribute("rdmString",rdmString); int width = 50; int height = 20; Color clr = getColor(); Color rclr = getReverseColor(clr); //创建图片对象,绘制图片,设置图片属性,产生噪点(最多50个),对图片对象编码 BufferImage bi = new BufferImage(width, height, BufferImage.TYPE_INT_RGB); Graphics2D g = bi.createGraphics(); g.setFont(new Font(FONT.SANS_SERFS,FONT.BOLD,12)); g.setColor(clr); g.fillRect(0,0,width,height); g.setColor(rclr); g.drawString(rdmString,10,10); for(int i=0,n=random.nextInt(50); i<n; n++,i++){ g.drawRect(width,height,1,1); } ServletOutputStream out = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(bi);//对图片对象编码 out.flush(); } }
<servlet> <servlet-name>codeServlet</servlet-name> <servlet-class>com.servlet.CodeServlet</servlet-class><!-- 实际的类路径 --> </servlet> <servlet-mapping> <servlet-name>codeServlet</servlet-name> <url-pattern>/servlet/codeServlet</url-pattern> </servlet-mapping>
<script> fucntion loadIMG(){ document.getElementById('btn1').disabled = true; document.getElementById('img1').src = "servlet/codeServlet?ts='+new Date().getTime+'"; } </script> <img id="img1" src="servlet/codeServlet" οnlοad="btn1.disabled = false;"> <input type="button" id="btn1" value="换一张" οnclick="loadIMG()">