本文共 4981 字,大约阅读时间需要 16 分钟。
Servlet形式的图形验证码
servlet代码如下:
package com.common.web.servlet.verifycode;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.ServletOutputStream;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.io.hw.awt.color.CustomColor;import com.string.widget.util.ValueWidget;/*** * 生成验证码 * 需要在web.xml中配置servlet才能访问 * * imageVerifyCode com.common.web.servlet.verifycode.RandomCodeServlet imageVerifyCode /imageVerifyCode
* @author huangwei * @since 20140424 */public class RandomCodeServlet extends HttpServlet { private static final long serialVersionUID = 2040832365570046619L; private int width = 60, height = 20; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String picFormat=request.getParameter("picFormat"); // 在内存中创建图象 BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics g = img.getGraphics(); // 设定背景色 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); // 生成随机类 Random r = new Random(); // 设定字体 Font f = new Font("Times New Roman", Font.PLAIN, 18); g.setFont(f); // 画边框 g.setColor(Color.BLACK); g.drawRect(0, 0, width - 1, height - 1);// g.setColor(Color.GRAY); // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到 for (int i = 0; i < 160; i++) { g.setColor(CustomColor.getLightColor()); int x = r.nextInt(width); int y = r.nextInt(height); int x1 = r.nextInt(12); int y1 = r.nextInt(12); g.drawLine(x, y, x + x1, y + y1); } StringBuffer sb = new StringBuffer(); int red = 0, green = 0, blue = 0; // 取随机产生的认证码(4位数字) for (int i = 0; i < 4; i++) { String strRand = String.valueOf(r.nextInt(10)); red = r.nextInt(110); green = r.nextInt(50); blue = r.nextInt(50); // 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成 g.setColor(new Color(red, green, blue)); // 将认证码显示到图象中 g.drawString(strRand, 13 * i + 6, 16); sb.append(strRand); } HttpSession session = request.getSession(); session.setAttribute("randomCode", sb.toString()); // 设置页面不缓存 response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); if(ValueWidget.isNullOrEmpty(picFormat)){ picFormat="jpeg"; } response.setContentType("image/"+picFormat);// System.out.println("verify code picFormat:"+picFormat); ServletOutputStream sos = response.getOutputStream(); ImageIO.write(img, picFormat, sos); sos.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}
依赖的类CustomColor: package com.io.hw.awt.color;import java.awt.Color;import java.util.Random;public class CustomColor { public static Color red_little=new Color(255,200,200); public static Color red_little_more=new Color(255,230,230); public static Color red_middle=new Color(255,100,100); public static Color blue_little_ocean=new Color(130,200,255); public static Color blue_little_gray=new Color(200,200,255); public static Color getColor(int r, int g, int b) { return new Color(r,g,b); } /*** * * @param isLightColour : 浅色(亮色) * @return */ public static Color getColor(boolean isLightColour){ int r = randomInt(isLightColour); int g = randomInt(isLightColour); int b = randomInt(isLightColour); while (r == 255 && g == 255 && b == 255) { r = randomInt(isLightColour); g = randomInt(isLightColour); b = randomInt(isLightColour); } return new Color(r, g, b); } public static Color getColor(){ return getColor(false); } /*** * 获取 * @return */ public static Color getLightColor(){ return getColor(true); } /*** * * @param isLightColour : 是否浅色(亮色) * @return */ public static int randomInt(boolean isLightColour) { Random dom = new Random(); if(isLightColour){//浅色(亮色) int base=125; return dom.nextInt(base)+(255-base); }else{ return dom.nextInt(255); } } public static int randomInt() { return randomInt(false/*isLightColour*/); } /*** * 浅色 * @return */ public static int randomIntLightColour() { return randomInt(true); } public static void main(String[] args) { System.out.println(randomInt()); System.out.println(randomInt()); System.out.println(randomInt()); }}如何访问呢?
配置web.xml:
imageVerifyCode com.common.web.servlet.verifycode.RandomCodeServlet imageVerifyCode /imageVerifyCode
访问地址:
http://127.0.0.1:8080/tv_mobile/imageVerifyCode?picFormat=gif