jecms 2012ソース分析(四)-----検証コード-jcaptcha分析
本稿では、jecmsで使用される検証コードjcapthchaを紹介します。
これはオープンソースのソフトウェアです。ダウンロード住所:
http://jcaptcha.sourceforge.net/
jecmsで使うバージョンはjcaptcha-1.0.jarです。
web.xmlの構成 ここのurlは/captcha.svlを使います。
servlet Jcapt charvletは画像を生成するコードを書き直しました。
login.の構成
認証コードの処理種別Cas Loginal.java パッケージパス:package comp.jecms.cms.actions.member;
検証コードは以下の通りです。
例えば生成時のコード:
これはオープンソースのソフトウェアです。ダウンロード住所:
http://jcaptcha.sourceforge.net/
jecmsで使うバージョンはjcaptcha-1.0.jarです。
<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>
servlet Jcapt charvletは画像を生成するコードを書き直しました。
<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メソッドの後にこの画像をクリックすると、新しい検証コードの画像が生成されます。検証コードは以下の通りです。
@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;