用来实现网页中的随机验证码功能,当然,只是实现了该出现功能,并没有实现判断对错功能,要做的话其实也是很简单的。
package servlet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; 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.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * @author Chalmers * @version 创建时间:2016年3月10日 下午7:41:25 */ public class ImageServlet extends HttpServlet { private static final long serialVersionUID = 1L; // 随机出现的字符 private static final String CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static Random random = new Random(); // 字符长度为6 private static final int NUM = 6; /** * 获得随机字符串 * * @return String */ private String getRandomString() { StringBuffer sb = new StringBuffer(); for (int i = 0; i < NUM; i++) { // 追加 sb.append(CHARS.charAt(random.nextInt(CHARS.length()))); } return sb.toString(); } /** * 返回字体颜色 * * @return Color */ private Color getFontColor() { Color c = null; // 采用rgb形式的颜色,随机生成三个小于255的整数 c = new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255)); return c; } /** * 获得背景颜色 * * @return Color */ private Color getBgColor(Color c) { // 采用与字体不一样的颜色 // 为了避免字体与背景颜色一样,而影响观察 return new Color(255 - c.getBlue(), 255 - c.getGreen(), 255 - c.getRed()); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 得到session对象,用来存储随机字符串的值 HttpSession session = request.getSession(true); response.setContentType("image/jpeg"); // 得到随机字符串 String randomString = getRandomString(); session.setAttribute("randomString", randomString); // 设置图片的宽和高 int width = 90; int height = 30; // 得到字体颜色 Color fontColor = getFontColor(); // 得到背景颜色 Color bgColor = getBgColor(fontColor); // 创建一个图片对象(该图片放置在内存中) BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); // 创建绘图对象,从image得到绘图对象,会把数据绘制到image上 Graphics2D g = image.createGraphics(); // 设置字体样式 g.setFont(new Font("宋体", Font.BOLD, 24)); // 设置背景颜色 g.setColor(bgColor); // 对图片进行填充 g.fillRect(0, 0, width, height); // 设置字体颜色 g.setColor(fontColor); // 在图片上绘制字符串 for (int i = 0; i < randomString.length(); i++) { g.drawString(randomString.charAt(i) + "", 8 + i * 12, 22); } // 画出干扰点 for (int i = 0, n = random.nextInt(100); i < n; i++) { // 设置点的位置以及大小 g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1); } // 将图片输出到浏览器中 ServletOutputStream outStream = response.getOutputStream(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outStream); encoder.encode(image); outStream.flush(); outStream.close(); } }
在网页中使用
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <img src="ImageServlet" /> </body> </html>
当然,要记得在xml文件中配置servlet
<servlet> <servlet-name>ImageServlet</servlet-name> <servlet-class>servlet.ImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>ImageServlet</servlet-name> <url-pattern>/ImageServlet</url-pattern> </servlet-mapping>