一個簡單的後端驗證框架
1.前端驗證框架用jquery validate即可滿足;
2.後端驗證框架有hibernate validate,可以滿足大部分的驗證功能。但是該驗證框架不能指定順序單獨返回錯誤資訊,例如在一個介面呼叫中,我想實現指定引數順序單個返回驗證提示資訊。如是自己寫了一個簡單的驗證框架實現了此功能;
3.該框架的校驗思想參考了jqueryvalidate;
package com.impay.pushua.bean.base; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; public class ValidateUtils { /** * @param fields * @param params * @return * 不存在的校驗規則:返回true * 關鍵字不按要求寫:返回true * 總之,想要起到校驗效果,必須按要求配置。 */ public static SKResult validate(ValidField[] fields, Map<String, String> params){ try { for(ValidField field : fields){ String name = field.getName(); String desc = field.getDes(); boolean isValid = field.isValid(); String[] rules = field.getRules(); String value = params.get(name); // 對應請求引數值 if(!isValid){ return new SKResult(true, ""); } for(String rule : rules){ String[] arr = rule.replaceAll(" ", "").split(":"); String arr1 = arr[0]; // required String arr2 = arr[1]; // true switch (arr1) { case "required": // 必須項 required:true|false if(Boolean.parseBoolean(arr2)){ if(value==null || value.trim().length()==0){ return new SKResult(false, desc+"不能為空"); } } break; case "number": // 必須輸入合法的數字(負數,小數) number:true|false if(Boolean.parseBoolean(arr2)){ try{ Double.valueOf(value); }catch(Exception e){ return new SKResult(false, desc+"數值型別不合法"); } } break; case "digits": // 必須輸入整數(正負) digits:true|false if(Boolean.parseBoolean(arr2)){ try{ Integer.valueOf(value); }catch(Exception e){ return new SKResult(false, desc+"數值型別不合法"); } } break; case "equalTo": // 指定引數值相等 equalTo:#username if(!value.equals(params.get(arr2.replace("#","")))){ return new SKResult(false, name+"與"+arr2.replace("#","")+"值不等"); } break; case "maxlength": // 最大長度 maxlength:3 int maxlength = Integer.parseInt(arr2); if(params.get(name).trim().length()>maxlength){ return new SKResult(false, desc+"最大長度為"+maxlength); } break; case "minlength": // 最小長度 minlength:3 int minlength = Integer.parseInt(arr2); if(params.get(name).trim().length()<minlength){ return new SKResult(false, desc+"最小長度為"+minlength); } break; case "rangelength": // 輸入長度必須介於 5 和 10 之間的字串(漢字算一個字元)rangelength:[5,10] String[] lens = arr2.substring(1, arr2.length()-1).split(","); int minLen = Integer.parseInt(lens[0]); int maxLen = Integer.parseInt(lens[1]); if(value.length()<minLen||value.length()>maxLen){ return new SKResult(false, desc+"長度應介於"+arr2+"之間"); } break; case "range": // 輸入值必須介於 5 和 10 之間 range:[5,10] try{ Double.valueOf(value); }catch(Exception e){ return new SKResult(false, desc+"值不合法"); } String[] lens2 = arr2.substring(1, arr2.length()-1).split(","); int minValue = Integer.parseInt(lens2[0]); int maxValue = Integer.parseInt(lens2[1]); if(Double.valueOf(value)<minValue||Double.valueOf(value)>maxValue){ return new SKResult(false, desc+"值應介於"+arr2+"之間"); } break; case "min": // 輸入值不能小於 5 min:5 try{ Double.valueOf(value); }catch(Exception e){ return new SKResult(false, desc+"值不合法"); } if(Double.parseDouble(value)<Double.parseDouble(arr2)){ return new SKResult(false, desc+"值不能小於"+arr2); } break; case "max": // 輸入值不能大於 5 max:5 try{ Double.valueOf(value); }catch(Exception e){ return new SKResult(false, desc+"值不合法"); } if(Double.parseDouble(value)>Double.parseDouble(arr2)){ return new SKResult(false, desc+"值不能大於"+arr2); } break; case "accept": // 輸入擁有合法字尾名的字串(上傳檔案的字尾) break; case "isTel": String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$"; if(!Pattern.matches(regex, value)){ return new SKResult(false, desc+"格式錯誤"); } break; default: break; } } } } catch (Exception e) { e.printStackTrace(); System.out.println("===ValidField格式不合法,請注意檢查!"); return new SKResult(true, "ValidField格式不合法"); } return new SKResult(true, "校驗通過"); } public static void main(String[] args) { Map<String, String> params = new HashMap<String, String>(); params.put("username", "18702764599"); params.put("password", "123"); ValidField[] fields = { new ValidField("username", "手機號", true, new String[]{ "required:true", "isTel:true" // "number:true" // "digits:true" // "maxlength:5" // "minlength:11" // "rangelength:[ 5 , 10 ]" // "range:[5,10]" // "min:5" // "max:5" }), /*new ValidField("password", "密碼", true, new String[]{ // "required:true", "isPassword:true", // "equalTo:#username" "max:2" })*/ }; SKResult sk = ValidateUtils.validate(fields, params); System.out.println(sk); /** * output * SKResult [result=true, respMsg=校驗通過, obj=null, type=null] */ } }
package com.impay.pushua.bean.base; /** * 提現請求 * * @author huwj * */ public class SKResult { // 返回程式碼 private boolean result; // 錯誤資訊 private String respMsg; private Object obj; @Override public String toString() { return "SKResult [result=" + result + ", respMsg=" + respMsg + ", obj=" + obj + ", type=" + type + "]"; } //處理方式:預設jsapi,為1時掃碼 private String type; public String getType() { return type; } public void setType(String type) { this.type = type; } public SKResult(boolean result, String respMsg) { super(); this.result = result; this.respMsg = respMsg; } public SKResult(boolean result, String respMsg, Object obj) { super(); this.result = result; this.respMsg = respMsg; this.obj = obj; } public boolean isResult() { return result; } public void setResult(boolean result) { this.result = result; } public String getRespMsg() { return respMsg; } public void setRespMsg(String respMsg) { this.respMsg = respMsg; } public Object getObj() { return obj; } public void setObj(Object obj) { this.obj = obj; } }
package com.impay.pushua.bean.base; /** * 引數校驗 */ public class ValidField { /** * 欄位名 */ private String name; /** * 欄位描述 */ private String des; /** * 為true必須校驗 */ private boolean isValid = false; /** * 校驗規則 */ private String[] rules; public String[] getRules() { return rules; } public void setRules(String[] rules) { this.rules = rules; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDes() { return des; } public void setDes(String des) { this.des = des; } public boolean isValid() { return isValid; } public void setValid(boolean isValid) { this.isValid = isValid; } public ValidField(String name, String des, boolean isValid, String[] rules) { super(); this.name = name; this.des = des; this.isValid = isValid; this.rules = rules; } }
相關推薦
一個簡單的後端驗證框架
1.前端驗證框架用jquery validate即可滿足; 2.後端驗證框架有hibernate validate,可以滿足大部分的驗證功能。但是該驗證框架不能指定順序單獨返回錯誤資訊,例如在一個介面呼叫中,我想實現指定引數順序單個返回驗證提示資訊。如是自己寫了一個簡單的驗
後端PHP框架laravel學習踩的各種坑
and 錯誤信息 cnblogs 技術 deb src wro 分享 tor 安裝完laravel的ventor目錄後出現“Whoops, looks like something went wrong.”這樣的錯誤信息 打開config/app.php,打開debug為
JAVA後端常用框架SSM,redis,dubbo等
處理 tran 收集 繼承 title ans .com sof 優先 JAVA後端常用框架SSM,redis,dubbo等 一、SpringMVC http://blog.csdn.net/evankaka/article/details/
編寫一個簡單登錄驗證需要記錄日誌,Servlet中的Cookie
cookie java servlet j2ee javaweb 登錄驗證並記錄日誌之前介紹了如何使用Server、mysql、tomcat等知識點編寫了一個簡單的登錄驗證。但是現在有了一個新的需求,我想要在登錄成功的時候往數據庫記錄一條日誌,登錄失敗的時候也要記錄一下。這個日誌要記錄用戶
maven+SpringMVC搭建RESTful後端服務框架
rest 頁面 pen update 靈活性 date cte requests compile 今天來嘗試一下搭建基於SpringMVC的RESTful標準的後端服務。 首先,什麽是MVC?M-model,模型,指業務數據層,具體一點就是業務邏輯與數據庫的交互;V-vi
用Java制作一個簡單的圖片驗證碼
err 一個 graphic opera login new pri buffer image //Java實現簡單驗證碼功能 package project; import java.awt.Color; import java.awt.Font;import java.
lazy-mock ,一個生成後端模擬數據的懶人工具
build 一行 根目錄 res per for bat 之前 asa lazy-mock ??lazy-mock 是基於koa2構建的,使用lowdb持久化數據到JSON文件。只需要簡單的配置就可以實現和json-server差不多的功能,但是比json-server更加
SSM+Shiro寫的一個簡單的登入驗證
專案結構 web.XML配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="
Web安全_檔案上傳總結(前端js驗證、後端驗證)
一、檔案上傳思路 首先我們通過一個網站上傳一個非法格式的檔案 在瀏覽載入檔案,但還未點選上傳按鈕時便彈出對話方塊,內容如:只允許上傳.jpg/.jpeg/.png字尾名的檔案,而此時並沒有傳送資料包。 如果網頁未彈窗,而在頁面彈窗,則考慮後端驗證 所以就圍繞前
手把手教你從零開始搭建SpringBoot後端專案框架
原料 新鮮的IntelliJ IDEA、一雙手、以及電腦一臺。 搭建框架 新建專案 開啟IDE,點選File -> New Project。在左側的列表中的選擇Maven專案,點選Next。 填寫GroupId和ArtifactId 什麼是GroupId和Ar
Java面試題2018---J2EE後端---MyBatis 框架
1、MyBatis 的核心原理,及執行流程 現在開源專案中持久層框架用到最多的基本就是 iBatis、myBatis 和 Hibernate 了。 原理詳解: MyBatis應用程式根據XML配置檔案建立SqlSessionFact
你最喜歡的後端開發框架是什麼?
Web應用程式開發核心是在前端開發,即使用者端視覺化的開發。在前端開發的程式設計師主要使用HTML,CSS和JavaScript,並負責應用程式的建立,設計和迭代更新。前端一些流行的JavaScript框架,包括Vue,React和Angular等。 對伺服器端開發感興趣的程式設
搭建一個簡單的cms前端框架
明確一點,我們的公司的專案是要求前後端分離 當然首選是node這塊,警告node很多強大的功能,自己瞭解的不深,不過慢慢學習中 好了,接下來講一下我的後端專案的前端部分的搭建過程 1、技術選型:這套框架是搭建給後臺人員用的,所以儘量去貼合他們的需要,我選用還是比較老的技術方
go實現一個簡單的遊戲伺服器框架(lotou)基本設計
程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。 因為go語言原生支援高併發(goroutine)和通訊機制(channel),所以首先想到的就是使用這兩個東西來構建我的訊息分發機制。 核心思路: 有一個core模組維護了所有的服務 當有訊息傳送的時候
h5移動開發Ajax上傳多張Base64格式圖片(前端傳送及後端驗證)
前端部分在這裡(親測可用) http://blog.csdn.net/woyidingshijingcheng/article/details/72461349 後端程式碼,就base64進行解
一個簡單的網路驗證程式的分析
一個關於網路賬戶認證的小程式的分析,包含兩種情況可能分析:一:只有客戶端EXE而無伺服器端的EXE。二:客戶端和伺服器都具有EXE檔案可供分析。 首先看第一種情況:只有客戶端EXE的分析步奏: 首先,開啟客戶端試看情況: 圖片1.png (7.54 KB, 下載次數:
go實現一個簡單的遊戲伺服器框架(lotou)起源
程式碼倉庫,目前程式碼比較粗糙,歡迎各種改進建議。 最近一直想學習一些關於遊戲伺服器的知識,顯示看了一下雲風的skynet框架,從而對於一個遊戲伺服器框架有了一個基本概要了解。先來說說我對於skynet的一些理解吧。 skynet理解 skynet只完成了
從頭建立一個簡單的RPC服務框架
概念解釋 RPC(Remote Procedure Call Protocol)——遠端過程呼叫協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。首先,客戶機呼叫程序傳送一個有程序
Python web後端開發框架 Django 、Flask、Tornado
httpserver : 非阻塞 HTTP serverhttpclient : 非同步 HTTP client 用來和web 及 httpserver 協同工作auth :第三方認證的實現locale:針對本地化和翻譯的支援等等
go實現一個簡單的遊戲伺服器框架(lotou)編碼
程式碼倉庫 在lotou中實現了兩種二進位制編碼方式。 binary 一種是普通的C/C++模式的小端編碼方式,每一個數據都被依次編碼進一個二進位制流中,基本用法如下: 編碼 binary.Encode(v) binary.Encode(v)