很多時候我們都是忽略了對象數據的合法性,以爲簡單通過前臺的js驗證下是否正確就可以了,這後果比較讓人但疼,下面舉例個簡單的例子,頁面需要用戶提交個簡介,用戶
這個時候可以寫腳本在這個內容裏,你說你在js有校驗合法性,但是你要明白,現在的抓包工具是可以等你提交的時候,攔截住請求,然後通過編輯器修改了提交的值來繞過前臺的js
驗證,這樣就造成了數據的不合法,所以如果數據安全要求高的,必須在後臺再次驗證合法性,下面我講下選擇的這個對象校驗框架---oval
OVal 是一個可擴展的Java對象數據驗證框架,驗證的規則可以通過配置文件、Annotation、POJOs 進行設定。可以使用純 Java 語言、JavaScript 、Groovy 、BeanShell 等進行規則的編寫。網上資料是很少,所以自己學習的時候碰壁比較多
oval框架可以支持xml,註解配置,我個人傾向於xml配置,因爲不想看到一個實體類的字段上寫了n多的註解,所以下面我說下如何使用這個框架,灰常簡單,暴力,靈活,不需要與頁面的表單層打交道
先看看如何單獨使用,比較簡單
public static void main(String[] args) {
try {
XMLConfigurer configurer = new XMLConfigurer(new File("valid-oval.xml"));
Validator validator = new Validator(configurer);
List<ConstraintViolation> violations = validator.validate(new Object());
for (ConstraintViolation violation : violations) {
System.out.println(violation.getMessage());
}
} catch (IOException e) {
e.printStackTrace();
}
}
直接通過validate方法傳入你需要校驗的對象即可,然後看看valid-oval.xml配置文件該如何寫
<?xml version="1.0" ?>
<oval
xmlns="http://oval.sf.net/oval-configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://oval.sf.net/oval-configuration http://oval.sourceforge.net/oval-configuration.xsd">
<constraintSet id="testPattern">
<notNull />
<matchPattern message="只允許純數字組合">
<pattern pattern="[0-9]+" flags="0" />
</matchPattern>
</constraintSet>
<class type="com.silvery.project.cms.model.Authority" overwrite="false" applyFieldConstraintsToSetter="true">
<field name="name">
<maxSize max="5" message="最多允許{max}個字符" />
<assertConstraintSet id="testPattern" />
</field>
<field name="content">
<assertConstraintSet id="testPattern" />
</field>
</class>
</oval>
有默認的校驗實現,有可自定義正則校驗,完全可以滿足你需要擴展的野心(不得不說有個深坑,我首次下載的是oval-1.84版本,自定義正則死活拋異常,然後換了個1.8的版本馬上可以,不知道是不是我的用法有問題,還是bug,有空再仔細研究)
下面再看看如何與spring結合配置
先聲明一個validator校驗器
<description>OVAL數據校驗器配置</description>
<bean id="validator" class="net.sf.oval.Validator">
<constructor-arg>
<list>
<bean class="net.sf.oval.configuration.xml.XMLConfigurer">
<constructor-arg type="java.io.InputStream" value="classpath:valid-oval.xml" />
</bean>
</list>
</constructor-arg>
</bean>
然後類裏面直接注入validator即可
@Autowired(required = false)
protected Validator validator;
if (!validModel) {
return viewResult.setFormValid(true);
}
Validator validator = getValidator();
if (validator != null) {
List<ConstraintViolation> violations = getValidator().validate(obj);
if (!isNull(violations)) {
viewResult.setFormValid(false);
viewResult.setFormErrors(validErrorToList(violations));
} else {
viewResult.setFormValid(true);
}
}
return viewResult;
下面再看看如何使用註解的方式,雖然這個更方便,但是我覺得還是xml配置比較好管理
private static class TestEntity
{
@Min(1960)
private int year = 1977;
@Range(min=1, max=12)
private int month = 2;
@ValidateWithMethod(methodName = "isValidDay", parameterType = int.class)
private int day = 31;
private boolean isValidDay(int day)
{
GregorianCalendar cal = new GregorianCalendar();
cal.setLenient(false);
cal.set(GregorianCalendar.YEAR, year);
cal.set(GregorianCalendar.MONTH, month - 1);
cal.set(GregorianCalendar.DATE, day);
try {
cal.getTimeInMillis(); // throws IllegalArgumentException
} catch (IllegalArgumentException e) {
return false;
}
return true;
}
}
這是別人的demo,我就懶得寫了, 我寫這個資料應該算是比較完整的了,希望對大家有幫助,還有比較多的功能,大家可以看下官方的api