1. 程式人生 > >簡析struts2.x中的輸入校驗

簡析struts2.x中的輸入校驗

在web中,對於頁面表單的輸入校驗,在客戶端我們可以寫js指令碼來校驗。但如果為了提高應用的安全性通常除了在客戶端利用js來校驗表單,我們通常還會在伺服器端進行再次校驗以提高安全性。而struts的輸入校驗則很好的解決了服務端的校驗,使得開發者只需編寫校驗規則檔案即可,這樣更加方便的管理服務端的校驗規則。除此以外,開發者還可以通過重寫validate方法來完成自定義校驗。

假如有個登入介面login.jsp中有個登入表單如下:

<s:form action="login">
    <s:textfield name="name" label="使用者名稱" />
    <s:textfield name="password" label="密碼" />
</s:form>

對應該表單,我們有個Action類叫LoginAction,該類的大致程式碼如下:

 public class LoginAction extends ActionSupprts{
      private String name;
      private String password;
      //name和password兩個屬性的set和get方法省略
       
       public  String execue() throws Exception{
          //do something here
      }
}

對應該Action我們有一個LoginAction類的校驗檔案。在struts2中,不同於struts1的輸入校驗檔案命名方法,Struts2中單獨對每一個Action指定一個校驗檔案,它的命名方式ActionName-validate.xml。他存放在與Action相同的保重,校驗只需要配置一個校驗檔案即可實現。系統的其他地方不需要改動,系統自動載入該檔案。

因此我們對應LoginAction類有個loginAction-validation.xml。該校驗檔案程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
<!--校驗檔案的根元素-->  
<validators>  
   <!--校驗Action的name屬性-->  
   <field name="name">  
       <!--指定name屬性必須滿足必填規則-->  
       <field-validator type="requiredstring">  
          <!--校驗去掉name屬性的前後空格,且指定name為必填屬性-->  
           <param name="trim">true</param>  
           <!--提示資訊-->  
           <message>使用者名稱不能為空!</message>  
       </field-validator>  
   </field>  
   <field name="password">  
       <field-validator type="requiredstring">  
           <param name="trim">true</param>  
           <message>密碼不能為空!</message>  
       </field-validator>  
       <!—指定密碼必須滿足匹配指定的正則表示式-->  
       <field-validator type="regex">  
           <param name="expression"><![CDATA[(\4{4,12})]]></param>  
           <message>密碼只能是字母和數字,且長度在4到12之間</message>  
       </field-validator>  
   </field>  
</validators>  

在該校驗檔案中,只有一個而且只能只有一個validators根元素,該validators根元素可以包含多個field元素,一個filed元素對應一個action的屬性,更準確的說應該是對應login.jsp表單中的屬性。那如果再校驗中使用者驗證失敗struts2會怎樣處理呢?在struts2中,如果使用者輸入不符合校驗檔案的規則,即校驗檔案判斷出使用者輸入了不合法的東西,此時struts2會返回名為“input”的Result,所以在對應的struts配置檔案中,我們還需要配置一個名位“input”的Result。這裡假如我們有個user-config.xml檔案。該檔案大致程式碼如下:

<action  name=login class="login的包名">
    <resule name="input" >/login.jsp</resule>
</action>

如果我們的應用就只我們國人用的話,那就沒有必要弄個什麼國際化資訊咯。但為了體現我們的應用於國際接軌,通常我們都會配置國際化的資訊。那如果配置國際化資訊的話,那我們再驗證檔案中的message屬性中就不能那樣寫中文了,而應該使用一個value-key對應的方式了。下面我們將改寫校驗檔案loginAction-validation.xml,改寫後的該檔案程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
<!--校驗檔案的根元素-->  
<validators>  
   <!--校驗Action的name屬性-->  
   <field name="name">  
       <!--指定name屬性必須滿足必填規則-->  
       <field-validator type="requiredstring">  
          <!--校驗去掉name屬性的前後空格,且指定name為必填屬性-->  
           <param name="trim">true</param>  
           <!--提示資訊-->  
           <message key="name.requried" />  //請注意這裡的寫法
       </field-validator>  
   </field>  
   <field name="password">  
       <field-validator type="requiredstring">  
           <param name="trim">true</param>  
           <message key="password.requried" />  
       </field-validator>  
       <!—指定密碼必須滿足匹配指定的正則表示式-->  
       <field-validator type="regex">  
           <param name="expression"><![CDATA[(\4{4,12})]]></param>  
           <message key="password.regex" />  
       </field-validator>  
   </field>  
</validators>  

我們還要新建一個國際化資訊的資原始檔假如名叫:login-CN.properties,該資原始檔中的程式碼如下:

name.requried=使用者名稱為空
password.requried=密碼不能為空
pass.regex=密碼只能是字母和數字,且長度在4到12之間

由於我們資原始檔中的中文不能被識別,所以我們需要使用比如native2ascii的軟體工具轉化該資原始檔。

還需建一個英文的資原始檔login-EN.properties,該資原始檔中的程式碼如下:

           
name.requried=name cannot be empty
password.requried=password cannot be empty 
pass.regex=The password is only letters and Numbers, and length in 4 to 12 between