`

java 生成验证码的servlet类

阅读更多
1. 生成验证码的servlet类

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
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;
import javax.servlet.http.HttpSession;

import com.***.constant.Constant;


public class ImageValidate extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2198678289097775859L;
	/**
	 * Constructor of the object.
	 */
	public ImageValidate() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	private String name;
	/**
	 * The doGet method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {
		
	    OutputStream outputStream = null;
	    
	    try {
	    	outputStream =  response.getOutputStream();
	     // 在内存中创建图象
	        int width = 60, height = 20;
	        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	        // 获取图形上下文
	        Graphics g = image.getGraphics();
	        // 生成随机类
	        Random random = new Random();
	        // 设定背景色
	        g.setColor(getRandColor(200, 250));
	        g.fillRect(0, 0, width, height);
	        // 设定字体
	        g.setFont(new Font("Times New Roman", Font.CENTER_BASELINE, 18));
	        // 画边框
	        // g.setColor(new Color());
	        // g.drawRect(0,0,width-1,height-1);
	        // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
	        g.setColor(getRandColor(160, 200));
	        for (int i = 0; i < 40; i++) {
	            int x = random.nextInt(width);
	            int y = random.nextInt(height);
	            int xl = random.nextInt(12);
	            int yl = random.nextInt(12);
	            g.drawLine(x, y, x + xl, y + yl);
	        }
	        // 取随机产生的认证码(4位数字)
	        String sRand = "";
	        for (int i = 0; i < 4; i++) {
	            String rand = String.valueOf(random.nextInt(10));
	            sRand += rand;
	            // 将认证码显示到图象中
	            g
	                    .setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random
	                            .nextInt(110)));// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
	            g.drawString(rand, 13 * i + 6, 16);
	        }
	        // 将认证码存入SESSION
	        HttpSession session=request.getSession();
	        session.setAttribute(Constant.LOGIN_VALIDATE_IMAGE, sRand);
	        // 图象生效
	        g.dispose();
	        // 输出图象到页面
	        ImageIO.write(image, "JPEG",outputStream);
	        outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            outputStream.close();
        }
        
		

	}

	/**
	 * 给定范围获得随机颜色
	 * 
	 * @param fc
	 * @param bc
	 * @return
	 */
	private static Color getRandColor(int fc, int bc) {
		Random random = new Random();
		if (fc > 255)
			fc = 255;
		if (bc > 255)
			bc = 255;
		int r = fc + random.nextInt(bc - fc);
		int g = fc + random.nextInt(bc - fc);
		int b = fc + random.nextInt(bc - fc);
		return new Color(r, g, b);
	}

	/**
	 * The doPost method of the servlet. <br>
	 * 
	 * This method is called when a form has its tag value method equals to
	 * post.
	 * 
	 * @param request
	 *            the request send by the client to the server
	 * @param response
	 *            the response send by the server to the client
	 * @throws ServletException
	 *             if an error occurred
	 * @throws IOException
	 *             if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {

		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

	/**
	 * Initialization of the servlet. <br>
	 * 
	 * @throws ServletException
	 *             if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}



2.web.xml 配置

<servlet>
    <servlet-name>ImageValidate</servlet-name>
    <servlet-class>com.***.web.servlet.ImageValidate</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ImageValidate</servlet-name>
    <url-pattern>/servlet/imageValidate</url-pattern>
  </servlet-mapping>



3.页面调用

<div class="login-tr">
	            	<div class="login-td-1 ft-sz-12 ft-cl-n">验证码:</div>
	                <div class="login-td-2"><input type="text" class="tt-text-yz tt-text" name="validateCode"> 
	                <span>
	                <img id="imgValidateCode" src="${BasePath}/servlet/imageValidate" width="55" height="20" align="top" border="0" style="cursor:hand"/>
	                </span>
	                <a href="javascript:reloadCode();">看不清?</a></div>
	            </div>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics