zoukankan      html  css  js  c++  java
  • 验证码生成组件--JCaptcha的使用

    以下为项目中所用代码,文笔有限,直接上代码。

    所需jar包:

    是否需要其他依赖包,不详


    web.xml

    <servlet>
         <servlet-name>Jcaptcha</servlet-name>
         <servlet-class>com.bkgd.cms.servlet.JcaptchaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
         <servlet-name>Jcaptcha</servlet-name>
         <url-pattern>/captcha.svl</url-pattern>
    </servlet-mapping>

    需要一个服务类 生成Image

    package com.bkgd.cms.servlet;
    
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.commons.io.output.ByteArrayOutputStream;
    import org.apache.log4j.Logger;
    import com.octo.captcha.service.CaptchaServiceException;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
    
    @SuppressWarnings("serial")
    public class JcaptchaServlet extends HttpServlet {
    	public static final String CAPTCHA_IMAGE_FORMAT = "jpeg";
    
    	private static final Logger log = Logger.getLogger(JcaptchaServlet.class);
    
    	@Override
    	public void init() throws ServletException {
    	}
    
    	/**
    	 * @step1 本方法使用Jcaptcha工具生成img图片,并输出到客户端
    	 * @step2 将来在用户提交的action中插入下面语句进行验证码的校验:Boolean isResponseCorrect =
    	 *        captchaService.validateResponseForID( captchaId, "");
    	 **/
    	@Override
    	protected void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws ServletException, IOException {
    		byte[] captchaChallengeAsJpeg = null;
    		ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
    		try {
    			// 借助于HttpSession ID存储Captcha ID,开发者也可以借助于其他惟一值
    			String captchaId = request.getSession().getId();
    			// 获得GMailEngine使用的图片内容
    			BufferedImage challenge = JCaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId, request.getLocale());
    			// 输出JPEG格式
    			JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
    			jpegEncoder.encode(challenge);
    		} catch (IllegalArgumentException e) {
    			log.error(e);
    			response.sendError(HttpServletResponse.SC_NOT_FOUND);
    			return;
    		} catch (CaptchaServiceException e) {
    			log.error(e);
    			response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
    			return;
    		}
    		captchaChallengeAsJpeg = jpegOutputStream.toByteArray();
    		response.setHeader("Cache-Control", "no-store");
    		response.setHeader("Pragma", "no-cache");
    		response.setDateHeader("Expires", 0);
    		// 输出JPEG图片
    		response.setContentType("image/jpeg");
    		ServletOutputStream responseOutputStream = response.getOutputStream();
    		responseOutputStream.write(captchaChallengeAsJpeg);
    		responseOutputStream.flush();
    		responseOutputStream.close();
    	}
    }
    

    JCaptchaServiceSingleton

    package com.bkgd.cms.servlet;
    
    import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
    import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
    import com.octo.captcha.service.image.ImageCaptchaService;
    
    public class JCaptchaServiceSingleton {
    	private static ImageCaptchaService imageCaptchaService = new DefaultManageableImageCaptchaService(
    			new FastHashMapCaptchaStore(), new GMailEngine(), 180, 100000,
    			75000);
    
    	public static ImageCaptchaService getInstance() {
    		return imageCaptchaService;
    	}
    }
    

    验证码样式的图片引擎GMailEngine

    package com.bkgd.cms.servlet;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.image.ImageFilter;
    
    import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
    import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
    import com.octo.captcha.component.image.color.RandomListColorGenerator;
    import com.octo.captcha.component.image.deformation.ImageDeformation;
    import com.octo.captcha.component.image.deformation.ImageDeformationByFilters;
    import com.octo.captcha.component.image.fontgenerator.FontGenerator;
    import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
    import com.octo.captcha.component.image.textpaster.DecoratedRandomTextPaster;
    import com.octo.captcha.component.image.textpaster.TextPaster;
    import com.octo.captcha.component.image.textpaster.textdecorator.TextDecorator;
    import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;
    import com.octo.captcha.component.image.wordtoimage.WordToImage;
    import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
    import com.octo.captcha.component.word.wordgenerator.WordGenerator;
    import com.octo.captcha.engine.image.ListImageCaptchaEngine;
    import com.octo.captcha.image.gimpy.GimpyFactory;
    
    /**
     * 仿照JCaptcha2.0编写GMail验证码样式的图片引擎.
     */
    public class GMailEngine extends ListImageCaptchaEngine {
    	@Override
    	protected void buildInitialFactories() {
    		int minWordLength = 4;
    		int maxWordLength = 4;
    		int fontSize = 26;
    		int imageWidth = 110;
    		int imageHeight = 50;
    		//在页面上将显示的内容
    		WordGenerator dictionnaryWords = new RandomWordGenerator("1234567890");
    		TextPaster randomPaster = new DecoratedRandomTextPaster(minWordLength,
    				maxWordLength, new RandomListColorGenerator(
    						new Color[] { new Color(0, 0, 0) }),
    				new TextDecorator[] {});
    		BackgroundGenerator background = new UniColorBackgroundGenerator(
    				imageWidth, imageHeight, Color.white);
    		FontGenerator font = new RandomFontGenerator(fontSize, fontSize,
    				new Font[] { new Font("nyala", Font.BOLD, fontSize),
    						new Font("Bell MT", Font.PLAIN, fontSize),
    						new Font("Credit valley", Font.BOLD, fontSize) });
    
    		ImageDeformation postDef = new ImageDeformationByFilters(new ImageFilter[] {});
    		ImageDeformation backDef = new ImageDeformationByFilters(new ImageFilter[] {});
    		ImageDeformation textDef = new ImageDeformationByFilters(new ImageFilter[] {});
    
    		WordToImage word2image = new DeformedComposedWordToImage(font,
    				background, randomPaster, backDef, textDef, postDef);
    		addFactory(new GimpyFactory(dictionnaryWords, word2image));
    	}
    
    }
    

    前台JSP

    <input class="input" type="text" name="checkCode" id="checkCode" value=""/>
    <img id="captcha" src="captcha.svl" onclick="this.src='captcha.svl?d='+new Date()*1"/>

    后台Action验证

    HttpServletRequest request = ServletActionContext.getRequest();
    String sessID = request.getSession().getId();
    Boolean isResponseCorrect = JCaptchaServiceSingleton.getInstance().validateResponseForID(sessID, checkCode);
    if(isResponseCorrect){
    	return "true"
    }else{
    	return "false"	
    }


  • 相关阅读:
    go 代理
    mongo创建用户
    博客搬家&留言板
    noip2020 SD选手迷惑行为大赏
    noip2020游记
    P4174 [NOI2006] 最大获利
    P3327 [SDOI2015]约数个数和
    P5069 [Ynoi2015]纵使日薄西山
    P3747 相逢是问候
    HDE6315 Naive Operations
  • 原文地址:https://www.cnblogs.com/itmyhome/p/4131350.html
Copyright © 2011-2022 走看看