验证码

介绍

  • 验证码有很多种,比如图片验证码、点击指定图片验证、加减乘除运算验证、移动拼图验证等。有很多种,其实目的都一样。
  • 验证码作用:防止机器攻击。
  • 这里只介绍一种图片验证(两种方式实现)

第一种

ValidateCode

  • 需要第三方包
    • ValidateCode.jar
  • 代码示例:
  //创建ValidateCode对象,设置宽、高、生成几位验证码、有几根影响线
  ValidateCode vc = new ValidateCode(120,40,6,20);
  //获取验证码,并保存到Session中
  request.getSession().setAttribute("code1",vc.getCode());
  //打印验证码
  System.out.println(code1);
  //把验证码图片传到网页
  vc.write(response.getOutputStream());

第二种

自己写生成代码

  • 代码示例:
  import java.util.*;
  import java.text.*;
  import java.awt.Color;
  import java.awt.image.BufferedImage;
  import java.awt.Graphics;
  import java.awt.Font;
  import javax.imageio.*;
  import java.io.IOException;
  import java.io.PrintWriter;
  
  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;
  
  public class ValidataCode extends HttpServlet {
  	Color getRandomColor(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);
  	}
  	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  		HttpSession session=request.getSession();
  		//设置页面不缓存    
  		response.setHeader("Pragma", "No-cache");
  		response.setHeader("Cache-Control", "no-cache");
  		response.setDateHeader("Expires", 0);
  
  		// 在内存中创建图象    
  		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(getRandomColor(200, 250));
  		g.fillRect(0, 0, width, height);
  
  		//设定字体    
  		g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
  
  		//画边框    
  		//g.setColor(new Color());    
  		//g.drawRect(0,0,width-1,height-1); 
  		// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到    
  		g.setColor(getRandomColor(160, 200));
  		for (int i = 0; i < 100; 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    
  		session.setAttribute("code", sRand);
  
  		// 图象生效    
  		g.dispose();
  
  		// 输出图象到页面    
  		ServletOutputStream sos = response.getOutputStream();
  		ImageIO.write(image, "JPEG", sos);
  		sos.close();
  	}
  
  	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  		this.doGet(request, response);
  	}
  
  }

其他

  • 其他类型验证码可以去GitHub搜索Captcha,有很多,可自行去研究研究。


转载请注明:Memory的博客 » 点击阅读原文

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦