1. 程式人生 > >一個簡單的後端驗證框架

一個簡單的後端驗證框架

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)