<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    京山游俠

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

    在SpringSide 3 中使用JCaptcha

    Posted on 2009-08-24 17:45 京山游俠 閱讀(7271) 評論(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集成使用的?能否指點一二?

    非常感謝!
    主站蜘蛛池模板: 亚洲va在线va天堂va不卡下载| 亚洲综合精品成人| eeuss影院www天堂免费| 亚洲VA综合VA国产产VA中| 99亚洲男女激情在线观看| 一本久到久久亚洲综合| 国产精品偷伦视频免费观看了| 久久久久亚洲AV成人无码网站 | 亚洲a无码综合a国产av中文| 亚洲欧洲国产成人综合在线观看| MM1313亚洲国产精品| 久久亚洲日韩看片无码| 日本免费的一级v一片| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 巨胸喷奶水视频www网免费| 有色视频在线观看免费高清在线直播| 亚洲AV无码乱码在线观看牲色| 亚在线观看免费视频入口| yellow视频免费看| 一本久久免费视频| 亚洲第一成年网站视频| 亚洲午夜久久久精品影院| 亚洲啪啪AV无码片| 亚洲精品tv久久久久久久久久| 国产电影午夜成年免费视频| 中文字幕免费人成乱码中国| 一个人看的www免费高清| 四虎国产精品成人免费久久| 亚洲精品人成网线在线播放va | 国产亚洲精品福利在线无卡一| 免费午夜爽爽爽WWW视频十八禁 | 999国内精品永久免费视频| 亚洲一区二区在线免费观看| 久久成人免费大片| 91精品成人免费国产| 三年在线观看免费观看完整版中文| 搜日本一区二区三区免费高清视频 | 国产AⅤ无码专区亚洲AV| 四虎在线视频免费观看视频| 国产日韩精品无码区免费专区国产 | 免费国产一级特黄久久|