验证码生成组件–JCaptcha的使用详解编程语言

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

所需jar包:

验证码生成组件--JCaptcha的使用详解编程语言

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

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"	 
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/14255.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论