1. 程式人生 > >ssm引數校驗

ssm引數校驗

方法一:使用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" />