第一步:在web.xml中配置servlet
- <servlet>
- <servlet-name>ImageServlet</servlet-name>
- <servlet-class>org.servlet.ImageServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ImageServlet</servlet-name>
- <url-pattern>/ImageServlet</url-pattern>
- </servlet-mapping>
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import com.farm.web.tool.RandomValidateCode;
- public class ImageServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("image/jpeg");// 设置相应类型,告诉浏览器输出的内容为图片
- response.setHeader("Pragma", "No-cache");// 设置响应头信息,告诉浏览器不要缓存此内容
- response.setHeader("Cache-Control", "no-cache");
- response.setDateHeader("Expire", 0);
- RandomValidateCode randomValidateCode = new RandomValidateCode();
- try {
- randomValidateCode.getRandcode(request, response);// 输出图片方法
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
- }
- import java.awt.Color;
- import java.awt.Font;
- import java.awt.Graphics;
- import java.awt.image.BufferedImage;
- import java.util.Random;
- import javax.imageio.ImageIO;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- public class RandomValidateCode {
- public static String validateCode = null;
- public static final String RANDOMCODEKEY = "RANDOMVALIDATECODEKEY";// 放到session中的key
- private Random random = new Random();
- private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";// 随机产生的字符串
- private int width = 80;// 图片宽
- private int height = 26;// 图片高
- private int lineSize = 40;// 干扰线数量
- private int stringNum = 4;// 随机产生字符数量
- /*
- * 获得字体
- */
- private Font getFont() {
- return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
- }
- /*
- * 获得颜色
- */
- private Color getRandColor(int fc, int bc) {
- if (fc > 255)
- fc = 255;
- if (bc > 255)
- bc = 255;
- int r = fc + random.nextInt(bc - fc - 16);
- int g = fc + random.nextInt(bc - fc - 14);
- int b = fc + random.nextInt(bc - fc - 18);
- return new Color(r, g, b);
- }
- /**
- * 生成随机图片
- */
- public void getRandcode(HttpServletRequest request,
- HttpServletResponse response) {
- HttpSession session = request.getSession();
- // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
- BufferedImage image = new BufferedImage(width, height,
- BufferedImage.TYPE_INT_BGR);
- Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
- g.fillRect(0, 0, width, height);
- g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));
- g.setColor(getRandColor(110, 133));
- // 绘制干扰线
- for (int i = 0; i <= lineSize; i++) {
- drowLine(g);
- }
- // 绘制随机字符
- String randomString = "";
- for (int i = 1; i <= stringNum; i++) {
- randomString = drowString(g, randomString, i);
- }
- session.removeAttribute(RANDOMCODEKEY);
- session.setAttribute(RANDOMCODEKEY, randomString);
- validateCode = randomString.toUpperCase();
- g.dispose();
- try {
- ImageIO.write(image, "JPEG", response.getOutputStream());// 将内存中的图片通过流动形式输出到客户端
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /*
- * 绘制字符串
- */
- private String drowString(Graphics g, String randomString, int i) {
- g.setFont(getFont());
- g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
- .nextInt(121)));
- String rand = String.valueOf(getRandomString(random.nextInt(randString
- .length())));
- randomString += rand;
- g.translate(random.nextInt(3), random.nextInt(3));
- g.drawString(rand, 13 * i, 16);
- return randomString;
- }
- /*
- * 绘制干扰线
- */
- private void drowLine(Graphics g) {
- int x = random.nextInt(width);
- int y = random.nextInt(height);
- int xl = random.nextInt(13);
- int yl = random.nextInt(15);
- g.drawLine(x, y, x + xl, y + yl);
- }
- /*
- * 获取随机的字符
- */
- public String getRandomString(int num) {
- return String.valueOf(randString.charAt(num));
- }
- }
src路径根据情况修改
- <tr>
- <td>
- <div align="right">
- 验证码:
- </div>
- </td>
- <td>
- <input style="width: 65px" id="validatecode" name="validatecode" type="text" />
- </td>
- <td>
- <img title="看不清楚,换一张?" style="cursor: pointer;"
- onclick="javascript:refresh(this);" src="<PF:basePath/>/ImageServlet">
- </td>
- </tr>
- function refresh(obj) {
- obj.src = "<PF:basePath/>/ImageServlet?"+Math.random();
- }
- if(RandomValidateCode.validateCode!=null&&validatecode.trim().toUpperCase().equals(RandomValidateCode.validateCode)){
- System.out.println("验证码正确");
- }
来源: http://www.phpxs.com/code/1002544/