在提交表单的功能实现中,验证码有时成为一个必不可少的功能,下面就直接进入代码实现:

1、首先编写一个产生验证码图片的Servlet,他的代码如下:

package com.flx.checkCode;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
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;

public class ImageServlet extends HttpServlet {
	private static int WIDTH=150;
	private static int HEIGHT=50;
	private static String[] randomNum={
		"A","B","C","D","E","F","G","T","U","R","t","b","X","a","W","V","N","d"
	};
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//1、在内存中创建一个图片
		BufferedImage image=new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
		//2、得到这个图
		Graphics g= image.getGraphics();
		//3、设置背景颜色
		setBackground(g);
		//4、设置图片边框
		setBorder(g);
		//5、设置图片的干扰线
		setRandomLine(g);
		//6、像图片上写数据
		String randomData= drawRandomData(g);
		//7、把图片写给客户端,再通知浏览器以图片的方式打开数据,并且要通知浏览器不能缓存图片
		response.setHeader("Expires", "-1");
		response.setHeader("Cache-Control", "no-cache");
		response.setHeader("Pragma","no-cache");
		response.setContentType("image/jpeg");
		ImageIO.write(image, "jpg", response.getOutputStream());
		//把产生的图片数据,在session中存一份
		request.getSession().setAttribute("checkcode", randomData.toUpperCase());
	}

	private String drawRandomData(Graphics g) {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<5;i++){
			sb.append(randomNum[new Random().nextInt(randomNum.length)]+" ");
		}
		String randomData=sb.toString();
		g.setColor(Color.RED);
		g.setFont(new Font("宋体",Font.BOLD,20));
		g.drawString(randomData, 10, 20);
		return randomData;
	}

	private void setRandomLine(Graphics g) {
		// TODO Auto-generated method stub
		g.setColor(Color.GREEN);
		for(int i=0;i<20;i++){
			int x1=new Random().nextInt(WIDTH);
			int x2=new Random().nextInt(HEIGHT);
			int y1=new Random().nextInt(WIDTH);
			int y2=new Random().nextInt(HEIGHT);
			g.drawLine(x1, y1, x2, y2);
		}
	}

	private void setBorder(Graphics g) {
		// TODO Auto-generated method stub
		g.setColor(Color.white);
		g.drawRect(1, 1, WIDTH, HEIGHT);
	}

	private void setBackground(Graphics g) {
		// TODO Auto-generated method stub
		g.setColor(Color.WHITE);
		g.fillRect(0, 0, WIDTH, HEIGHT);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doGet(request, response);
	}

}



接着在webroot下创建一个jsp文件,在里面用img标签scr属性进行引用:

验证码:<img alt="看不清" src="${pageContext.request.contextPath }/ImageServlet">



效果如下:

java 使用aop实现验证码防刷 验证码怎么实现java_javaee

如果点击图片能够进行图片验证码的刷新,建议用Ajax实现请求。