• Jsp+servlet 验证码案例


    昨晚在csdn看到一位前辈写一个ajax+servlet+jsp验证。顿时心血来潮,在阅读前辈的代码下我亲手体验一下,做了一个验证码生成工具类。以供大家做个參考。

    1:加入VeriyCodeUtils类生成验证码图像

    package com.servlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.OutputStream;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    
    /**
     * 
     * @author hubiao
     *		验证码生成器
     * 	用到API
     * 		BufferedImage 创建一个图像
     * 		Graphics2D  绘制
     * 			fillRect(x,y,width,height);背景
     * 			font()字体
     * 			drawRect();边框
     * 			drawLine();线
     * 			drwaString:图像数据
     * 		ImageIO 生成图像
     */
    public class VeriyCodeUtils {
    	/**
    	 * @param output 保存验证图像的流
    	 * @return  验证码
    	 */
    	public static String newVeriyCode(OutputStream output)
    	{
    		int width = 90;
    		int height = 40;
    		int codeCount = 5;
    		char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',     
    	            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',     
    	            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };  
    		
    		//创建图像对象,8位RGB
    		BufferedImage buffered = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    		
    		//通过Crapahices来绘制图像到BufferedImage中
    		Graphics2D gra = buffered.createGraphics();
    		
    		//设置图片背景:白色
    		gra.setColor(Color.WHITE);
    		gra.fillRect(0, 0, width, height);
    		
    		//设置字体,字体大小依据图片高度决定
    		gra.setFont(new Font("Fixedsys",Font.PLAIN,height-2));
    		
    		//设置边框:黑色,1cm
    		gra.setColor(Color.BLACK);
    		gra.drawRect(0, 0, width-1, height-1);
    		
    		//生成10条黑色干扰线
    		gra.setColor(Color.BLACK);
    		Random ran = new Random(); 
    		for(int i = 0; i < 70;i++)
    		{
    			int x = ran.nextInt(255);
    			int y = ran.nextInt(255);
    			int x1 = ran.nextInt(255);
    			int y1 = ran.nextInt(255);
    			gra.drawLine(x, y,x+x1, y+y1);//画直线
    		}
    		//生成验证码
    		StringBuffer sb = new StringBuffer();
    		int r = 0,g = 0,b = 0; 
    		for(int i = 0; i < codeCount; i++)
    		{
    			String strRand = String.valueOf(codeSequence[ran.nextInt(codeSequence.length)]);
    			//对每位验证码都生成不同的颜色。添加识别系统难度
    			r = ran.nextInt(255);
    			g = ran.nextInt(255);
    			b = ran.nextInt(255);
    			gra.setColor(new Color(r, g, b));
    			gra.drawString(strRand, (i+1)*13, height-4);
    			sb.append(strRand);
    		}
    		try {
    			ImageIO.write(buffered, "jpeg", output);
    		} catch (Exception e) {
    			throw new RuntimeException(e);
    		}
    		
    		return sb.toString();
    	}
    }
    

    2:servlet使用验证码

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		//禁止图像缓存
            resp.setHeader("Pragma", "no-cache");     
            resp.setHeader("Cache-Control", "no-cache");     
            resp.setDateHeader("Expires", 0);   
            resp.setContentType("image/jpeg");
            
            //生成验证码图像
    		String veriyCode = VeriyCodeUtils.newVeriyCode(resp.getOutputStream());
    		
    		//将验证码保存到session中
    		HttpSession session = req.getSession();
    		session.setAttribute("validateCode", veriyCode);
    	}
    3:JSP页面使用验证码
    </head>
      <script type="text/javascript">
    		function createCode()
    		{
    		 	var t = new Date().getTime();//防止页面缓存。使用时间搓
    			var srcImg = document.getElementById("srcImg");
    			srcImg.src="/ImgVeifyWeb/vity.do?"+t; 
    		}
      </script>
      <body>
      	<h1>${requestScope.code}</h1>
      	<img id="srcImg" src="<c:url value="/vity.do"></c:url>" 	/>  #这里使用直接让img訪问servlet,通过response响应一个图像流
      	<a href="##" id="codeId" onclick="createCode()">换一张</a>
      	<form action="<c:url value="/hello.do"></c:url>" method="post">
    	  	<input type="text" name="codeVify"/>
    	  	<input type="submit" value="提交"/>
      	</form>
      </body>
    3:校验验证码

    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    			throws ServletException, IOException {
    		HttpSession session = req.getSession();
    		Object validateCode = session.getAttribute("validateCode");
    		System.out.println(validateCode);
    		
    		String codeVify = req.getParameter("codeVify");
    		if(codeVify==null || codeVify.equals(""))
    		{
    			req.setAttribute("code","验证证不能为空");
    			req.getRequestDispatcher("/index.jsp").forward(req, resp);
    			return;
    		}else if(!validateCode.toString().equalsIgnoreCase(codeVify))
    		{
    			req.setAttribute("code","验证证错误");
    			req.getRequestDispatcher("/index.jsp").forward(req, resp);
    			return;
    		}
    		System.out.println("以下開始 做其它业务操作....");
    	}
    校验图例如以下:


  • 相关阅读:
    JavaScript (new)创建一个对象的过程
    我所理解的promise的then方法
    promise与async和await的区别
    JS Promise实例 then()方法
    电脑上不去网
    es6----set map应用场景
    ES6新特性一览
    es6继承
    es6中class类的全方面理解(一)
    时间处理金字教程
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/6891518.html
Copyright © 2020-2023  润新知