京山游俠

          專注技術,拒絕扯淡
          posts - 50, comments - 868, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          在SpringSide 3 中使用JCaptcha

          Posted on 2009-08-24 17:45 京山游俠 閱讀(7270) 評論(5)  編輯  收藏 所屬分類: SpringSide開發實戰
          在目前的網絡上,想必大家對驗證圖片已經司空見慣了。驗證圖片是區分人和計算機的一種既有效又簡單的方法。為了提高網站的安全性,防止黑客利用計算機進行暴力破解和防止黑客使用程序自動提交大量垃圾信息,在我們的網站中引入驗證碼機制是必要的。

          在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");

          就這么簡單。祝大家愉快!

          評論

          # re: 在SpringSide 3 中使用JCaptcha  回復  更多評論   

          2009-08-27 14:54 by crabboy
          沒寫完吧。
          用ajax前臺怎么寫?

          # re: 在SpringSide 3 中使用JCaptcha  回復  更多評論   

          2009-08-27 19:16 by 海邊沫沫
          @crabboy
          前臺的AJAX當然是各有各的搞法啦,每一個程序員使用的方法都不一定一樣,每一個框架使用的方法都不一定一樣啊。

          重要的是能夠把數據傳遞給AJAX前臺,至于數據采取什么樣的組織方式也沒有一定之規。

          # re: 在SpringSide 3 中使用JCaptcha[未登錄]  回復  更多評論   

          2009-09-21 19:21 by 笨笨
          與樓主心有靈犀,謝謝分享。

          # re: 在SpringSide 3 中使用JCaptcha  回復  更多評論   

          2009-11-30 20:57 by flyliying
          沫沫,你太能折騰了,厲害

          # re: 在SpringSide 3 中使用JCaptcha  回復  更多評論   

          2012-03-23 16:40 by d
          沫沫您好,請問springside是怎樣和JAX-WS集成使用的?能否指點一二?

          非常感謝!
          主站蜘蛛池模板: 太白县| 新昌县| 巴林左旗| 武汉市| 垣曲县| 阿图什市| 宜川县| 樟树市| 台东市| 古田县| 盐亭县| 桐庐县| 邵阳市| 专栏| 原阳县| 东兴市| 荥经县| 华坪县| 台南县| 眉山市| 冷水江市| 隆安县| 万载县| 启东市| 晋城| 南通市| 平凉市| 海口市| 镇江市| 永胜县| 清徐县| 广南县| 海宁市| 贺州市| 隆德县| 长治县| 新民市| 荥阳市| 绿春县| 洛扎县| 宣威市|