在目前的網絡上,想必大家對驗證圖片已經司空見慣了。驗證圖片是區分人和計算機的一種既有效又簡單的方法。為了提高網站的安全性,防止黑客利用計算機進行暴力破解和防止黑客使用程序自動提交大量垃圾信息,在我們的網站中引入驗證碼機制是必要的。
在SpringSide 3的Showcase中,江南白衣演示了JCaptcha。Captcha是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自動區分計算機和人類的圖靈測試)的簡稱,而JCaptcha是一個在該理論下的基於Java的一個實現。我終於開始看Showcase中的一些特性了,下面來談談把JCaptcha集成到項目中的一些想法。
首先要把如下四個jar包拷貝到項目中:
jcaptcha-1.0.jar
jcaptcha-api-1.0.jar
imaging-01012005.jar
springside3-jee-3.1.5.jar
以上四個jar文件前兩個不用我多解釋,imaging-01012005.jar是必須要的,因為它提供了JCaptcha需要的 WaterFilter類,而springside3-jee-3.1.5.jar裡面包含的就是SpringSide 3對JCaptcha的擴展。SpringSide 3對JCaptcha做了哪些擴展呢?主要表現在兩個方面:一是編寫了一個Filter,用來配合SpringSecurity,二是實現了一個圖片生成引擎,即GMailEngine。
事實上,JCaptcha是可以直接使用的,即直接使用CaptchaService類來生成和驗證圖片中的信息,而CaptchaService可以使用Spring管理;但是一旦和SpringSecurity配合起來使用就比較麻煩了,因為我們不可能去修改SpringSecurity的代碼,所以就只能在web.xml中配置Filter了。但是在不和SpringSecurity配合的情況下,我們還是少不了直接使用 CaptchaService類,因為Filter是定制死了的,不靈活,如果我們要返回供AJAX使用的字符串,就必須得自己寫代碼。
好了,下面看看具體步驟。
1、先在Spring的配置文件中配置CaptchaService的Bean,如下:
<!--JCaptcha驗證碼服務 -->
<bean id="captchaService" class="com.octo.captcha.service.image.DefaultManageableImageCaptchaService">
<property name="captchaEngine">
<bean class="org.springside.modules.security.jcaptcha.GMailEngine" />
</property>
<property name="minGuarantedStorageDelayInSeconds" value="600" />
</bean>
2、在web.xml中配置Filter,如下:
<!-- SpringSide's JCaptcha filter -->
<filter>
<filter-name>jcaptchaFilter</filter-name>
<filter-class>org.springside.modules.security.jcaptcha.JCaptchaFilter</filter-class>
<init-param>
<param-name>failureUrl</param-name>
<param-value>/login.action?error=2</param-value>
</init-param>
</filter>
<!-- jcaptcha圖片生成URL. -->
<filter-mapping>
<filter-name>jcaptchaFilter</filter-name>
<url-pattern>/security/jcaptcha.jpg</url-pattern>
</filter-mapping>
<!-- jcaptcha登錄表單處理URL.
必須放在springSecurityFilter的filter-mapping定義之前 -->
<filter-mapping>
<filter-name>jcaptchaFilter</filter-name>
<url-pattern>/j_spring_security_check</url-pattern>
</filter-mapping>
3、在所有需要顯示驗證圖片的JSP文件中使用如下代碼:
<img id="captchaImage" src="${ctx}/security/jcaptcha.jpg" width="100" height="40" align="middle" onclick="onImageClick(this);">(如看不清,可點擊圖片更換)
這裡的onclick函數主要是為了實現點擊圖片更換的效果,其代碼如下:
function onImageClick(o){
o.src = "/PureText/security/jcapthcha.jpg?update=" + Math.random();
}
這時候,符合SpringSecurity要求的登錄界面就會自動驗證用戶的輸入了。
但是,我們並不是只有登錄這一個地方需要使用驗證圖片,在用戶注冊、發表文章等這些地方都需要用到,而且為了不讓用戶離開輸入界面,一般使用AJAX,這時候怎麼辦呢?不使用Filter,我們依然可以手動驗證,如下代碼片斷,則是在Action類中截取的:
// 驗證cpatchaImage
boolean flag = false;
try {
HttpServletRequest request = Struts2Utils.getRequest();
String captchaID = request.getSession().getId();
String captchaValue = request.getParameter("captchaValue");
ApplicationContext context = WebApplicationContextUtils
.getWebApplicationContext(Struts2Utils.getSession()
.getServletContext());
CaptchaService captchaService = (CaptchaService) context
.getBean("captchaService");
flag = captchaService
.validateResponseForID(captchaID, captchaValue);
} catch (Exception e) {
flag = false;
}
if (!flag) {
success = false;
result += "captcha_err.innerHTML='驗證碼輸入錯誤。';";
} else {
result += "captcha_err.innerHTML='';";
}
if (success == false) {
result += "failed();";
Struts2Utils.renderHtml(result, "encoding:UTF-8");
就這麼簡單。祝大家愉快!