struts2中伺服器端數據校驗

来源:http://www.cnblogs.com/weiyi-1009/archive/2016/09/02/5832411.html
-Advertisement-
Play Games

數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分為客戶端驗證和伺服器端驗證,今天隨筆主要寫的是實現伺服器端的數據驗證,伺服器端數據驗證主要特點: ·數據提交後在伺服器端驗證 ·防止繞過客戶端驗證提交的非法數據 ·可以在伺服器端處理數據前保證數據的合法性 Struts2中有兩種實現伺服器端驗證 ...


2016-09-02

數據校驗指對數據合法性進行檢查,根據驗證數據的位置可以分為客戶端驗證和伺服器端驗證,今天隨筆主要寫的是實現伺服器端的數據驗證,伺服器端數據驗證主要特點:

      ·數據提交後在伺服器端驗證

      ·防止繞過客戶端驗證提交的非法數據

      ·可以在伺服器端處理數據前保證數據的合法性

Struts2中有兩種實現伺服器端驗證的方式。

一、       使用ActionSupport編碼實現驗證

  1. 在Action類的方法中直接驗證

在Action 類中直接進行校驗是一種最為原始的方法,這裡作為瞭解,首先是action 類中的驗證代碼:

private User user;

 

      @Override

      public String execute() throws Exception {

         //驗證用戶名

         if(user.getName()==null || "".equals(user.getName())){

           this.addFieldError("user.name", "用戶名不能為空");

           return INPUT;

         }

         addActionError("用戶名或密碼錯誤!");//添加action錯誤提示

         if(this.hasErrors()){

           return INPUT;

         }

            return SUCCESS;

}

然後在JSP頁面中使用標簽輸出錯誤信息。

                       <s:fielderror fieldName="user.name"></s:fielderror>  //根據欄位輸出錯誤信息

     <s:actionerror/>   //輸出action錯誤信息

 

  1. 重寫validate()方法驗證

Validate()是實現驗證的方法,他會在業務方法之前調用,驗證不通過則業務處理不執行.

private User user;

     

      @Override

      public String execute() throws Exception {

          System.out.println("完成註冊業務");

          addActionError("用戶名或密碼錯誤!");

          if(this.hasErrors()) return INPUT;

          return SUCCESS;

      }

     

      @Override

      public void validate() {

          if(null==user.getName() || "".equals(user.getName())){

             this.addFieldError("user.name", "用戶名不能為空!");

          }

}

  1. 使用validateXxx()方法實現驗證

前面的validate()方法會對所有業務方法進行驗證,而我們只需對單個業務類進行驗證時就要用到validateXxx()方法,Xxx指被驗證的方法名,代碼如下.

public String register() throws Exception {

        System.out.println("完成註冊業務");

        addActionError("用戶名或密碼錯誤!");

        if(this.hasErrors()) returnINPUT;

        returnSUCCESS;

     }

  

     publicvoid validateRegister() {

        if(null==user.getName() || "".equals(user.getName())){

           this.addFieldError("user.name", "用戶名不能為空!");

        }

在register()被調用之前會先調用validateRegister()進行數據校驗。

 

 

二、   使用驗證框架實現驗證

在實際開發中,很多驗證是相同的,對於這些許重覆實現的驗證,完全可以統一實現,struts2的驗證框架就實現了這一功能。使用驗證框架時,所有的驗證規則是寫在配置文件中,便於開發與維護,所以這裡詳細介紹一下驗證框架。

  1. 編寫JSP數據輸入頁面

表單部分代碼:

<form id="register" action="register.action" method="post">

  <table >

    <caption>註冊</s:text></caption>

    <tbody>

       <tr>

          <td>登錄名:</s:text></td>

          <td><input type="text" name="user.name" value="${user.name }" /></td>

          <td><s:fielderror fieldName="user.name"></s:fielderror></td>

       </tr>

    <tr>

          <td>密碼:</s:text></td>

          <td><input type="password" name="user.pass" /></td>

       <td><s:fielderror fieldName="user.pass"></s:fielderror></td>

       </tr>

    <tr>

          <td>重覆密碼:</s:text></td>

          <td><input type="password" name="pass" /></td>

       <td><s:fielderror fieldName="pass"></s:fielderror></td>

       </tr>

    <tr>

          <td>年齡:</td>

          <td><input type="text" name="user.age" /></td>

       <td><s:fielderror fieldName="user.age"></s:fielderror></td>

       </tr>

    <tr>

          <td>收入:</td>

          <td><input type="text" name="user.income" /></td>

       <td><s:fielderror fieldName="user.income"></s:fielderror></td>

       </tr>

    <tr>

          <td>生日:</td>

          <td><input type="text" name="user.birthday" /></td>

       <td><s:fielderror fieldName="user.birthday"></s:fielderror></td>

       </tr>

    <tr>

          <td>Email</td>

          <td><input type="text" name="user.email" /></td>

       <td><s:fielderror fieldName="user.email"></s:fielderror></td>

       </tr>

    <tr>

          <td>個人主頁 URL</td>

          <td><input type="text" name="user.url" /></td>

       <td><s:fielderror fieldName="user.url"></s:fielderror></td>

       </tr>       

    <tr>

          <td colspan="3" align="center"><input class="submit" type="submit" value="提交" /></td>

       </tr>

    </tbody>

  </table></form>

 

  1. 編寫action類和配置文件

首先是配置文件,配置文件的命名必須為Xxx-yyy-validation.xml,Xxx為對應的action類名,這個文件只要與對應action 類放在同一目錄下就會被自動識別,這裡命名為UserAction-register-validation.xml。

 

 

Action 中代碼:

 

 

配置文件中的代碼:

<?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE validators PUBLIC

        "-//Apache Struts//XWork Validator 1.0.2//EN"

        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">

<validators>

  <field name="user.name" >

     <field-validator type="requiredstring">

        <param name="trim">true</param>

        <message>用戶名不能為空</message>

     </field-validator>

     <field-validator type="regex">

        <param name="expression"><![CDATA[\w{4,16}]]></param>

        <message>用戶名長度必須在 4-16 位之間</message>

     </field-validator>

  </field>

  <field name="user.pass">

     <field-validator type="requiredstring">

        <message >密碼不能為空</message>

     </field-validator>

     <field-validator type="stringlength">

        <param name="maxLength">16</param>

        <param name="minLength">6</param>       

        <message>密碼長度必須在 ${minLength} - ${maxLength} 之間</message>

     </field-validator>

  </field>

  <field name="pass">

     <field-validator type="fieldexpression">

        <param name="expression"><![CDATA[pass==user.pass]]></param>       

        <message>密碼和確認密碼必須一致</message>

     </field-validator>

  </field>

  <field name="user.age">

     <field-validator type="conversion"  short-circuit="true">

        <message>年齡必須是整數</message>

     </field-validator>   

     <field-validator type="required">

        <message>年齡不能為空</message>

     </field-validator>

     <field-validator type="int">

        <param name="max">150</param>

        <param name="min">0</param>       

        <message>年齡必須在 ${min}-${max} 之間</message>

     </field-validator>

  </field>

  <field name="user.income">     

     <field-validator type="conversion" short-circuit="true">

        <message>收入必須是數字</message>

     </field-validator>   

     <field-validator type="required">

        <message>收入不能為空</message>

     </field-validator>

     <field-validator type="double">

        <param name="maxInclusive">1000000</param>

        <param name="minInclusive">2999.95</param>

        <message>收入必須在 ${minInclusive}-${maxInclusive} 之間</message>

     </field-validator>

  </field> 

  <field name="user.birthday">   

     <field-validator type="conversion" short-circuit="true">

        <message>生日必須寫作:2008-08-08</message>

     </field-validator>   

     <field-validator type="required" >

        <message>生日不能為空</message>

     </field-validator>

     <field-validator type="date">

        <param name="min">2000-01-01</param>

        <param name="max">2009-12-31</param>

        <message>生日必須在 (2000-01-01, 2009-12-31) 之間</message>

     </field-validator>

  </field> 

  <field name="user.email">

     <field-validator type="requiredstring">

        <message>email 不能為空</message>

     </field-validator>

     <field-validator type="email">       

        <message>email 格式不合法</message>

     </field-validator>

  </field>

  <field name="user.url">

     <field-validator type="requiredstring">

        <message>個人主頁必填</message>

     </field-validator>

     <field-validator type="url">      

        <message>url 地址錯誤</message>

     </field-validator>

  </field>

</validators>       

 

至此驗證規則也寫完了,然後在我們提交表單的時候就可以看到錯誤提示了。

另外需要註意的是,struts2中內置了類型轉換錯誤提示,所以有可能出現雙重提示的狀況。

 

 

這時候可以通過在struts.xml中設置解決。

<constant name="struts.custom.i18n.resources" value="msg"/> //設置提示資源msg

 

然後在src目錄下簡歷msg.properties資源文件,添入xwork.default.invalid.fieldvalue=。就可以了。

到這裡表單數據的後臺驗證就結束了。

 

  

最後附上一張數據驗證流程圖。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • /** * 組合微信app支付 獲得prepayid * @param int $order_num */ private function _wxpay_request($order_num = 0) { //判斷訂單編號必須是數組並且不為0 check_order_num($order_num) ...
  • 一、HTTPS簡介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),簡單來講就是加了安全的HTTP,即HTTP+SSL;我們知道HTTP通訊時,如果客戶端C請求伺服器S,那麼可以通過網路抓包的形式來獲取信息,甚至可以模擬伺服器 ...
  • //壓入首字母 foreach ($res as $k => $v) { $res[$k]['first'] = strtoupper(substr(trim($v['name']), 0, 1)); $arr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', ' ...
  • array_sum(array_column($attr, '欄位')); ...
  • 本節作業: 選課系統 角色:學校、學員、課程、講師要求:1. 創建北京、上海 2 所學校2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開3. 課程包含,周期,價格,通過學校創建課程 4. 通過學校創建班級, 班級關聯課程、講師5. 創建學員 ...
  • 轉載請標明出處; 最近在看redis的代碼,發現了有關函數指針的部分,想把它記下來。 在redis中有類似下麵的定義,利用typedef 定義了一個新的類型,這種類型是一個函數: 然後可以用這個類型定義一個指針,這個指針指向一個函數,具體redis中使用如下(具體redis的源碼解析,後面的文章中還 ...
  • 問題就是對一個list中的新聞id進行去重,去重之後要保證順序不變。 直觀方法 最簡單的思路就是: 複製代碼代碼如下: ids = [1,2,3,3,4,2,3,4,5,6,1]news_ids = []for id in ids: if id not in news_ids: news_ids.a ...
  • PHP(personal homepage)是HTML內嵌式語言,是一種在伺服器端執行的嵌入HTML文檔的腳本語言。由zend公司維護。為什麼要安裝web伺服器?因為我們瀏覽器要取數據,從web伺服器湖獲取。httpwatch工具可以獲取發送和接受的數據,有利於我們瞭解的更透徹。伺服器除Appche ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...