`
riyunzhu
  • 浏览: 30004 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

简析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
      

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics