在目前的網(wǎng)絡(luò)上,想必大家對(duì)驗(yàn)證圖片已經(jīng)司空見(jiàn)慣了。驗(yàn)證圖片是區(qū)分人和計(jì)算機(jī)的一種既有效又簡(jiǎn)單的方法。為了提高網(wǎng)站的安全性,防止黑客利用計(jì)算機(jī)進(jìn)行暴力破解和防止黑客使用程序自動(dòng)提交大量垃圾信息,在我們的網(wǎng)站中引入驗(yàn)證碼機(jī)制是必要的。
在SpringSide 3的Showcase中,江南白衣演示了JCaptcha。Captcha是Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自動(dòng)區(qū)分計(jì)算機(jī)和人類(lèi)的圖靈測(cè)試)的簡(jiǎn)稱,而JCaptcha是一個(gè)在該理論下的基于Java的一個(gè)實(shí)現(xiàn)。我終于開(kāi)始看Showcase中的一些特性了,下面來(lái)談?wù)劙袹Captcha集成到項(xiàng)目中的一些想法。
首先要把如下四個(gè)jar包拷貝到項(xiàng)目中:
jcaptcha-1.0.jar
jcaptcha-api-1.0.jar
imaging-01012005.jar
springside3-jee-3.1.5.jar
以上四個(gè)jar文件前兩個(gè)不用我多解釋,imaging-01012005.jar是必須要的,因?yàn)樗峁┝薐Captcha需要的WaterFilter類(lèi),而springside3-jee-3.1.5.jar里面包含的就是SpringSide 3對(duì)JCaptcha的擴(kuò)展。SpringSide 3對(duì)JCaptcha做了哪些擴(kuò)展呢?主要表現(xiàn)在兩個(gè)方面:一是編寫(xiě)了一個(gè)Filter,用來(lái)配合SpringSecurity,二是實(shí)現(xiàn)了一個(gè)圖片生成引擎,即GMailEngine。
事實(shí)上,JCaptcha是可以直接使用的,即直接使用CaptchaService類(lèi)來(lái)生成和驗(yàn)證圖片中的信息,而CaptchaService可以使用Spring管理;但是一旦和SpringSecurity配合起來(lái)使用就比較麻煩了,因?yàn)槲覀儾豢赡苋バ薷腟pringSecurity的代碼,所以就只能在web.xml中配置Filter了。但是在不和SpringSecurity配合的情況下,我們還是少不了直接使用CaptchaService類(lèi),因?yàn)镕ilter是定制死了的,不靈活,如果我們要返回供AJAX使用的字符串,就必須得自己寫(xiě)代碼。
好了,下面看看具體步驟。
1、先在Spring的配置文件中配置CaptchaService的Bean,如下:
<!--JCaptcha驗(yàn)證碼服務(wù) -->
<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、在所有需要顯示驗(yàn)證圖片的JSP文件中使用如下代碼:
<img id="captchaImage" src="${ctx}/security/jcaptcha.jpg" width="100" height="40" align="middle" onclick="onImageClick(this);">(如看不清,可點(diǎn)擊圖片更換)
這里的onclick函數(shù)主要是為了實(shí)現(xiàn)點(diǎn)擊圖片更換的效果,其代碼如下:
function onImageClick(o){
o.src = "/PureText/security/jcapthcha.jpg?update=" + Math.random();
}
這時(shí)候,符合SpringSecurity要求的登錄界面就會(huì)自動(dòng)驗(yàn)證用戶的輸入了。
但是,我們并不是只有登錄這一個(gè)地方需要使用驗(yàn)證圖片,在用戶注冊(cè)、發(fā)表文章等這些地方都需要用到,而且為了不讓用戶離開(kāi)輸入界面,一般使用AJAX,這時(shí)候怎么辦呢?不使用Filter,我們依然可以手動(dòng)驗(yàn)證,如下代碼片斷,則是在Action類(lèi)中截取的:
// 驗(yàn)證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='驗(yàn)證碼輸入錯(cuò)誤。';";
} else {
result += "captcha_err.innerHTML='';";
}
if (success == false) {
result += "failed();";
Struts2Utils.renderHtml(result, "encoding:UTF-8");
就這么簡(jiǎn)單。祝大家愉快!