jecms 2012ソース分析(四)-----検証コード-jcaptcha分析

3839 ワード

本稿では、jecmsで使用される検証コードjcapthchaを紹介します。
 
これはオープンソースのソフトウェアです。ダウンロード住所:
 
http://jcaptcha.sourceforge.net/
 
jecmsで使うバージョンはjcaptcha-1.0.jarです。
 
  • web.xmlの構成
    	<servlet>
    		<servlet-name>Jcaptcha</servlet-name>
    		<servlet-class>com.jeecms.common.captcha.JcaptchaServlet</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>Jcaptcha</servlet-name>
    		<url-pattern>/captcha.svl</url-pattern>
    	</servlet-mapping>
  •  ここのurlは/captcha.svlを使います。
     
    servlet Jcapt charvletは画像を生成するコードを書き直しました。
     
  • login.の構成
  • <span><<span class="start-tag">form</span>
    
    
     <span class="attribute-name">id</span>
    
    
    ="<a class="attribute-value">jvForm</a>
    
    
    " <span class="attribute-name">action</span>
    
    
    ="<a class="attribute-value">/login.jspx</a>
    
    
    " <span class="attribute-name">method</span>
    
    
    ="<a class="attribute-value">post</a>
    
    
    "></span>
    
    
    <span>
    ...</span>
    
    
     
    <td colspan="2"><img src="/captcha.svl" onclick="this.src='/captcha.svl?d='+new Date()*1" 
    width="100" height="35"/></td>
    ...
    </form>
    
        Oclickメソッドの後にこの画像をクリックすると、新しい検証コードの画像が生成されます。
     
  • 認証コードの処理種別Cas Loginal.java
  • パッケージパス:package comp.jecms.cms.actions.member;
     
    検証コードは以下の通りです。
    @RequestMapping(value = "/login.jspx", method = RequestMethod.POST)
    	public String submit(String username, String password, String captcha,
    			String processUrl, String returnUrl, String message,
    			HttpServletRequest request, HttpServletResponse response,
    			ModelMap model) {
    		Integer errorRemaining = unifiedUserMng.errorRemaining(username);
    		CmsSite site = CmsUtils.getSite(request);
    		String sol = site.getSolutionPath();
    		WebErrors errors = validateSubmit(username, password, captcha,
    				errorRemaining, request, response);
    
    
    。。。。。
    
    private WebErrors validateSubmit(String username, String password,
    			String captcha, Integer errorRemaining, HttpServletRequest request,
    			HttpServletResponse response) {
    		WebErrors errors = WebErrors.create(request);
    		if (errors.ifOutOfLength(username, "username", 1, 100)) {
    			return errors;
    		}
    		if (errors.ifOutOfLength(password, "password", 1, 32)) {
    			return errors;
    		}
    		//         ,      ;         ,                。
    		if (!StringUtils.isBlank(captcha)
    				|| (errorRemaining != null && errorRemaining < 0)) {
    			if (errors.ifBlank(captcha, "captcha", 100)) {
    				return errors;
    			}
    			try {
    				if (!imageCaptchaService.validateResponseForID(session
    						.getSessionId(request, response), captcha)) {
    					errors.addErrorCode("error.invalidCaptcha");
    					return errors;
    				}
    			} catch (CaptchaServiceException e) {
    				errors.addErrorCode("error.exceptionCaptcha");
    				log.warn("", e);
    				return errors;
    			}
    		}
    		return errors;
    	}
    。。。。
    なお、イメージの生成と検証は、sessionidによるものとします。
    例えば生成時のコード:
    String captchaId = session.getSessionId(request, response);
    			BufferedImage challenge = captchaService.getImageChallengeForID(
    					captchaId, request.getLocale());
    			// Jimi.putImage("image/jpeg", challenge, jpegOutputStream);
    			ImageIO.write(challenge, CAPTCHA_IMAGE_FORMAT, jpegOutputStream);
    認証時のコード:
    if (!imageCaptchaService.validateResponseForID(session
    						.getSessionId(request, response), captcha)) {
    					errors.addErrorCode("error.invalidCaptcha");
    					return errors;