ssm引數校驗
阿新 • • 發佈:2018-11-20
方法一:使用hibernate-validate框架,使用起來較為麻煩(SpringMVC官方推薦);
方法二:使用aop面向切面和自定義註解;
攔截器與aop:
aop可以取得被代理方法的物件和引數,而攔截器需要從請求中取值在校驗,且校驗規則也不好取得。
步驟:
1、定義註解
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ValidateParam { Validatefiled[] fileds(); }
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Validatefiled { boolean notNull() default false; int maxLength() default -1; int minLength() default -1; String regex() default ""; int maxVal() default -1; int minVal() default -1; }
2、自定義異常類
public class BadParamException extends Exception{
/**
*
*/
private static final long serialVersionUID = 1L;
public BadParamException() {
super();
}
public BadParamException(String msg) {
super(msg);
}
}
3、定義切面
import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import com.constant.ValidateMegConstant; import com.exception.BadParamException; @Aspect //指定當前類為切面類 @Component //加入到IoC容器 public class ValidateAop { //宣告切入點 @Pointcut("@annotation(com.aop.ValidateParam)") public void validatePointcut() {} //@within(com.util.test):表示攔截含有com.util.test這個註解類的所有方法;@annotation(com.aop.test):表示攔截含有com.tuil.test這個註解的所有方法 //切入點執行前的方法 @Before("validatePointcut()") public void validate(JoinPoint point) throws BadParamException { //獲取上傳的方法引數 Object[] args = point.getArgs(); //獲取切入點的方法 Method method = ((MethodSignature) point.getSignature()).getMethod(); //獲取所有引數物件 /*Parameter[] parameters = method.getParameters(); for (Parameter parameter : parameters) { System.out.println(parameter.getName()); }*/ Validatefiled[] fileds = method.getAnnotation(ValidateParam.class).fileds(); validateParam(fileds, args); } private void validateParam(Validatefiled[] fileds, Object[] args) throws BadParamException { // Map<String, String> resultMap = new HashMap<String, String>(); for (int i = 0; i < fileds.length; i++) { Validatefiled filed = fileds[i]; Object argObj = args[i]; //引數是否可為空值 if(filed.notNull()) { if (argObj == null || "".equals(argObj)) { throw new BadParamException(ValidateMegConstant.NOTNULL_MSG); } } //以下校驗需保證引數不為空值 if (argObj != null || "".equals(argObj)) { String argStr = argObj.toString(); //驗證引數格式 if(!"".equals(filed.regex())) { boolean bool = argStr.matches(filed.regex()); if(!bool) { throw new BadParamException(ValidateMegConstant.REGEX_MSG); } } //最小長度 if (filed.minLength() != -1) { if (argStr.length() < filed.minLength()) { throw new BadParamException(ValidateMegConstant.MIN_LENGTH_MSG); } } //最大長度 if (filed.maxLength() != -1) { if (argStr.length() > filed.maxLength()) { throw new BadParamException(ValidateMegConstant.MAX_LENGTH_MSG); } } //最小數值 if (filed.minVal() != -1) { int argInt = Integer.parseInt(argStr); if (argInt < filed.minVal()) { throw new BadParamException(ValidateMegConstant.MIN_VALUE_MSG); } } //最大數值 if (filed.maxVal() != -1) { int argInt = Integer.parseInt(argStr); if (argInt > filed.maxVal()) { throw new BadParamException(ValidateMegConstant.MAX_VALUE_MSG); } } } } } }
4、springMVC配置異常處理類
import java.lang.reflect.UndeclaredThrowableException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import com.constant.ResultConstant;
import com.util.DataUtil;
/**
* 統一異常處理類
* @author Administrator
*
*/
//在springMVC中,所有用於處理在請求對映和請求過程中丟擲異常的類,都要實現HandlerExceptionResolver介面。
//HandlerExceptionResolver介面中有一個方法resolveException,當controller層出現異常後就會進入到這個方法中。
//HandlerExceptionResolver只能處理請求過程中丟擲的異常
public class ResolveExceptionResolver implements HandlerExceptionResolver{
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) {
Map<String, Object> resultMap = new HashMap<String, Object>();
if (ex instanceof UndeclaredThrowableException) {
ex = (Exception) ((UndeclaredThrowableException)ex).getUndeclaredThrowable();
resultMap.put("code", ResultConstant.CODE_ERROR_PARAM);
resultMap.put("message", ex.getMessage());
} else {
resultMap.put("code", ResultConstant.CODE_SYSTEM);
resultMap.put("message", "系統異常");
}
DataUtil.writeToClient(resultMap, response);
return null;
}
}
<!-- 框架異常處理Handler -->
<bean id="resolveExceptionResolver" class="com.exception.ResolveExceptionResolver"></bean>
使用:
@ValidateParam(fileds = { @Validatefiled (notNull=true)})
@RequestMapping("test")
public void test(String a, HttpServletResponse p) {
}
注意:
如果使用springMVC與spring框架,配置aop時配置檔案的內容需寫入到springMVC的配置檔案中:
<aop:aspectj-autoproxy proxy-target-class="true" />
<context:component-scan base-package="com.aop" />