午夜拍鍵驚奇
          子夜 編程 代碼與我同在
          posts - 48,comments - 118,trackbacks - 79

          三、自定義校驗邏輯

          畢竟Struts提供的校驗邏輯有限,不可能滿足所有的開發需要,因此有時必須對其進行擴展。這里舉一個實際項目中的例子:校驗碼檢查?,F在很多網站為了防止惡意的頁面刷新攻擊,都使用了圖片形式的校驗碼,如:

          表單提交后需要檢查校驗碼(存在request或session里)和用戶輸入是否一致,代碼如下:

           1public class MyValidator{
           2  private static Logger logger = Logger.getLogger(Constants.CON_LOGGER_NAME);
           3
           4  public static boolean validateCodeInput(Object obj,ValidatorAction action,Field field,
           5      ActionMessages errors,HttpServletRequest req){
           6    String code = (String)req.getSession().getAttribute(Constants.SESSION_CHECKSUM_CODE);
           7    String input = ValidatorUtils.getValueAsString(obj,field.getProperty());
           8
           9    logger.debug("Code: " + code + ", input: " + input);
          10    if(code.equalsIgnoreCase(input))
          11      return true;
          12    else{
          13      errors.add(field.getKey(),Resources.getActionMessage(req,action,field));
          14      return false;
          15    }

          16  }

          17}

          注釋:
          1、第1行:MyValidator沒有任何父類,運行時Validator通過reflection生成對象
          2、第4行:校驗方法可隨意命名,通過reflection調用,但參數必須按照規范
          3、第6行:從session中取出圖片中的字符串
          4、第7行:得到用戶輸入的值,Struts在這里用Field類對表單字段進行了封裝,而Field具體封裝的字段在validation.xml中定義,見上篇

          validator-rules.xml中的定義:

           1<validator name="codeinput"
           2            classname="consultII.web.utils.MyValidator"
           3               method="validateCodeInput"
           4         methodParams="java.lang.Object,
           5                       org.apache.commons.validator.ValidatorAction,
           6                       org.apache.commons.validator.Field,
           7                       org.apache.struts.action.ActionMessages,
           8                       javax.servlet.http.HttpServletRequest"
           9                  msg="errors.code"/>
          10

          validation.xml中的定義:

          <field property="input" depends="required,codeinput"/>

          <field property="input" depends="required,codeinput"/>

          在servlet中將校驗碼存入session傳遞給Validator:

          req.getSession().setAttribute(Constants.SESSION_CHECKSUM_CODE,code);

          這樣就OK了。

          四、將校驗邏輯轉譯成JavaScript代碼

          由于Validator的代碼在服務器端被執行,因此如果校驗請求頻繁的話將會對服務器端造成不小的性能壓力。考慮到這個問題,Struts中提供的校驗方法可以被轉譯成JavaScript代碼嵌入頁面,這樣校驗將在客戶端進行。
          使用時,只要在頁面中嵌入兩條Struts html標簽庫中的標簽:

          1<html:javascript formName = "formName" />
          2<html:form action = "" onsubmit = "return validateFormName(this);" />

          其中第一行定義了需要轉譯的FormBean名,這里是“formName”,第二行在該FormBean封裝的表單上添加onsubmuit事件,而該事件調用的函數會在JSP請求到客戶端時由Validator框架自動生成,命名規則為“validateXXX”,其中“XXX”就是第一行中的formName屬性的值,這里是“formName”,因此生成的函數名為“validateFormName”。
          關于為自定義的Validator(如上文的MyValidator)創建JS代碼,我沒有實現過,感興趣的話可以去Struts官網上找一下相關文檔。
          posted on 2006-03-07 18:38 ^ Mustang ^ 閱讀(1823) 評論(1)  編輯  收藏 所屬分類: Struts

          FeedBack:
          # re: 在Struts中使用Validator實現可配置的信息校驗(二)
          2006-03-07 19:53 | 王巍成
          good?。。海?nbsp; 回復  更多評論
            
          主站蜘蛛池模板: 眉山市| 平原县| 锦屏县| 华池县| 故城县| 长宁县| 安达市| 栾川县| 南阳市| 侯马市| 海城市| 洛浦县| 阿坝| 岚皋县| 新源县| 马尔康县| 广丰县| 马山县| 大丰市| 五大连池市| 禄丰县| 菏泽市| 甘谷县| 武隆县| 泗阳县| 黄龙县| 通州市| 谢通门县| 乐安县| 宝坻区| 无锡市| 龙山县| 建水县| 祥云县| 西乌珠穆沁旗| 盐津县| 武陟县| 长兴县| 临朐县| 五常市| 友谊县|