驗證碼應用的地方很多,多處用於防止使用者惡意不間斷錄入。
下面就介紹一種java驗證碼的方式:拿登入功能來舉例(例子中使用了struts2+spring2.6.5)
首先login.jsp寫一個IMG標籤和JS方法。
<img id="captchaImage" src="<%=request.getContextPath()%>/login/createJcaptcha.action" width="100" height="30" align="top" onclick="onImageClick(this);">
function onImageClick(o){ document.getElementById('captchaImage').src ='<%=request.getContextPath()%>/login/createJcaptcha.action?captchaId=' + Math.random(); }
spring設定檔:
<bean id="captchaEngine"class="com.octo.captcha.engine.image.gimpy.SimpleListImageCaptchaEngine" /><bean id="captchaService"class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService"><property name="captchaEngine" ref="gmailEngine" /><property name="minGuarantedStorageDelayInSeconds" value="600" /></bean>
需要jar包:jcaptcha-2.0-alpha-1-SNAPSHOT.jar
後台Action代碼:
private ImageCaptchaService captchaService;(已被注入)
建立驗證碼
public void createJcaptcha() throws IOException {
byte[] captchaChallengeAsJpeg = null; ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream(); String captchaId = request.getParameter("captchaId"); if (logger.isDebugEnabled()) { logger.debug("captchaIdParameter: " + captchaId); } captchaId = request.getSession().getId(); BufferedImage challenge = getCaptchaService().getImageChallengeForID(captchaId, request.getLocale()); JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream); jpegEncoder.encode(challenge); captchaChallengeAsJpeg = jpegOutputStream.toByteArray(); response.setHeader("Cache-Control", "no-store"); response.setHeader("Pragma", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); OutputStream os = response.getOutputStream(); try { os.write(captchaChallengeAsJpeg); os.flush(); } finally { os.close(); } }
提交時校正驗證碼:
public boolean checkJcaptcha() {
boolean flag = false; String checkcode = checkCode.trim(); // 提取驗證碼 String id = request.getSession().getId(); if (StringUtils.isNotBlank(checkcode)) { flag = this.getCaptchaService().validateResponseForID(id, checkcode); } return flag; }