使用SpringAop 验证方法参数是否合法
(原文地址:http://blog.csdn.net/is_zhoufeng/article/details/7683194)
1、依赖包
aspectjweaver.jar
其中Maven的配置
可以参考 利用Spring AOP自定义注解解决日志和签名校验 http://www.cnblogs.com/shipengzhi/articles/2716004.html
2、验证相关类
共三个类,分别是
ValidateGroup.java | ValidateFiled.java | ValidateAspectHandel.java
先定义两个注解类ValidateGroup 和 ValidateFiled
ValidateGroup .java
- package com.zf.ann;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface ValidateGroup {
- public ValidateFiled[] fileds() ;
- }
ValidateFiled.java
- package com.zf.ann;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.METHOD)
- public @interface ValidateFiled {
- /**
- * 参数索引位置
- */
- public int index() default -1 ;
- /**
- * 如果参数是基本数据类型或String ,就不用指定该参数,如果参数是对象,要验证对象里面某个属性,就用该参数指定属性名
- */
- public String filedName() default "" ;
- /**
- * 正则验证
- */
- public String regStr() default "";
- /**
- * 是否能为空 , 为true表示不能为空 , false表示能够为空
- */
- public boolean notNull() default false;
- /**
- * 最大长度 , 用于验证字符串
- */
- public int maxLen() default -1 ;
- /**
- * 最小长度 , 用于验证字符串
- */
- public int minLen() default -1 ;
- /**
- *最大值 ,用于验证数字类型数据
- */
- public int maxVal() default -1 ;
- /**
- *最小值 ,用于验证数值类型数据
- */
- public int minVal() default -1 ;
- }
注解处理类
ValidateAspectHandel.java
- package com.zf.aspet;
- import java.lang.annotation.Annotation;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import org.aspectj.lang.ProceedingJoinPoint;
- import org.aspectj.lang.annotation.Around;
- import org.aspectj.lang.annotation.Aspect;
- import org.springframework.stereotype.Component;
- import org.springframework.web.servlet.ModelAndView;
- import com.zf.ann.ValidateFiled;
- import com.zf.ann.ValidateGroup;
- /**
- * 验证注解处理类
- * @author zhoufeng
- */
- @Component
- @Aspect
- public class ValidateAspectHandel {
- /**
- * 使用AOP对使用了ValidateGroup的方法进行代理校验
- * @throws Throwable
- */
- @SuppressWarnings({ "finally", "rawtypes" })
- @Around("@annotation(com.zf.ann.ValidateGroup)")
- public Object validateAround(ProceedingJoinPoint joinPoint) throws Throwable {
- boolean flag = false ;
- ValidateGroup an = null;
- Object[] args = null ;
- Method method = null;
- Object target = null ;
- String methodName = null;
- try{
- methodName = joinPoint.getSignature().getName();
- target = joinPoint.getTarget();
- method = getMethodByClassAndName(target.getClass(), methodName); //得到拦截的方法
- args = joinPoint.getArgs(); //方法的参数
- an = (ValidateGroup)getAnnotationByMethod(method ,ValidateGroup.class );
- flag = validateFiled(an.fileds() , args);
- }catch(Exception e){
- flag = false;
- }finally{
- if(flag){
- System.out.println("验证通过");
- return joinPoint.proceed();
- }else{ //这里使用了Spring MVC ,所有返回值应该为Strng或ModelAndView ,如果是用Struts2,直接返回一个String的resutl就行了
- System.out.println("验证未通过");
- Class returnType = method.getReturnType(); //得到方法返回值类型
- if(returnType == String.class){ //如果返回值为Stirng
- return "/error.jsp"; //返回错误页面
- }else if(returnType == ModelAndView.class){
- return new ModelAndView("/error.jsp");//返回错误页面
- }else{ //当使用Ajax的时候 可能会出现这种情况
- return null ;
- }
- }
- }
- }
- /**
- * 验证参数是否合法
- */
- public boolean validateFiled( ValidateFiled[] valiedatefiles , Object[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException{
- for (ValidateFiled validateFiled : valiedatefiles) {
- Object arg = null;
- if("".equals(validateFiled.filedName()) ){
- arg = args[validateFiled.index()];
- }else{
- arg = getFieldByObjectAndFileName(args[validateFiled.index()] ,
- validateFiled.filedName() );
- }
- if(validateFiled.notNull()){ //判断参数是否为空
- if(arg == null )
- return false;
- }else{ //如果该参数能够为空,并且当参数为空时,就不用判断后面的了 ,直接返回true
- if(arg == null )
- return true;
- }
- if(validateFiled.maxLen() > 0){ //判断字符串最大长度
- if(((String)arg).length() > validateFiled.maxLen())
- return false;
- }
- if(validateFiled.minLen() > 0){ //判断字符串最小长度
- if(((String)arg).length() < validateFiled.minLen())
- return false;
- }
- if(validateFiled.maxVal() != -1){ //判断数值最大值
- if( (Integer)arg > validateFiled.maxVal())
- return false;
- }
- if(validateFiled.minVal() != -1){ //判断数值最小值
- if((Integer)arg < validateFiled.minVal())
- return false;
- }
- if(!"".equals(validateFiled.regStr())){ //判断正则
- if(arg instanceof String){
- if(!((String)arg).matches(validateFiled.regStr()))
- return false;
- }else{
- return false;
- }
- }
- }
- return true;
- }
- /**
- * 根据对象和属性名得到 属性
- */
- public Object getFieldByObjectAndFileName(Object targetObj , String fileName) throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException{
- String tmp[] = fileName.split("\\.");
- Object arg = targetObj ;
- for (int i = 0; i < tmp.length; i++) {
- Method methdo = arg.getClass().
- getMethod(getGetterNameByFiledName(tmp[i]));
- arg = methdo.invoke(arg);
- }
- return arg ;
- }
- /**
- * 根据属性名 得到该属性的getter方法名
- */
- public String getGetterNameByFiledName(String fieldName){
- return "get" + fieldName.substring(0 ,1).toUpperCase() + fieldName.substring(1) ;
- }
- /**
- * 根据目标方法和注解类型 得到该目标方法的指定注解
- */
- public Annotation getAnnotationByMethod(Method method , Class annoClass){
- Annotation all[] = method.getAnnotations();
- for (Annotation annotation : all) {
- if (annotation.annotationType() == annoClass) {
- return annotation;
- }
- }
- return null;
- }
- /**
- * 根据类和方法名得到方法
- */
- public Method getMethodByClassAndName(Class c , String methodName){
- Method[] methods = c.getDeclaredMethods();
- for (Method method : methods) {
- if(method.getName().equals(methodName)){
- return method ;
- }
- }
- return null;
- }
- }
需要验证参数的Control方法
- package com.zf.service;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.servlet.ModelAndView;
- import com.zf.ann.ValidateFiled;
- import com.zf.ann.ValidateGroup;
- import com.zf.vo.Person;
- @Controller("PersonControl")
- public class PersonControl {
- //下面方法 ,是需要验证参数的方法
- @ValidateGroup(fileds = {
- //index=0 表示下面方法的第一个参数,也就是person nutNull=true 表示不能为空
- @ValidateFiled(index=0 , notNull=true ) ,
- //index=0 表示第一个参数 filedName表示该参数的一个属性 ,也就是person.id 最小值为3 也就是 person.id 最小值为3
- @ValidateFiled(index=0 , notNull=true , filedName="id" , minVal = 3) ,
- //表示第一个参数的name 也就是person.name属性最大长度为10,最小长度为3
- @ValidateFiled(index=0 , notNull=true , filedName="name" , maxLen = 10 , minLen = 3 ) ,
- //index=1 表示第二个参数最大长度为5,最小长度为2
- @ValidateFiled(index=1 , notNull=true , maxLen = 5 , minLen = 2 ) ,
- @ValidateFiled(index=2 , notNull=true , maxVal = 100 , minVal = 18),
- @ValidateFiled(index=3 , notNull=false , regStr= "^\\w+@\\w+\\.com$" )
- })
- @RequestMapping("savePerson")
- public ModelAndView savePerson(Person person , String name , int age , String email){
- ModelAndView mav = new ModelAndView("/index.jsp");
- System.out.println("addPerson()方法调用成功!");
- return mav ; //返回index.jsp视图
- }
- }
application.xml配置
测试
- package com.zf.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.zf.service.PersonControl;
- import com.zf.vo.Person;
- public class PersonTest {
- public static void main(String[] args) {
- ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
- PersonControl ps = (PersonControl) ac.getBean("PersonControl"); //测试
- ps.savePerson(new Person(3, "qqq") , "sss" , 100 , "243970446@qq.com");
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/tx
- http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd">
- <context:component-scan base-package="com.*"></context:component-scan>
- <!-- 启动对@AspectJ注解的支持 -->
- <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
- </beans>
springmvc的配置文件中还要加上<aop:aspectj-autoproxy proxy-target-class="true" />:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:lang="http://www.springframework.org/schema/lang"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller,实现参数校验 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
使用SpringAop 验证方法参数是否合法的更多相关文章
- 使用Spring Aop验证方法参数是否合法
先定义两个注解类ValidateGroup 和 ValidateFiled ValidateGroup .java package com.zf.ann; import java.lang.annot ...
- 封装jQuery Validate扩展验证方法
一.封装自定义验证方法-validate-methods.js /***************************************************************** j ...
- ASP.NET开发中主要的字符验证方法-JS验证、正则表达式、验证控件、后台验证
ASP.NET开发中主要的字符验证方法-JS验证.正则表达式.验证控件.后台验证 2012年03月19日 星期一 下午 8:53 在ASP.NET开发中主要的验证方法收藏 <1>使用JS验 ...
- JQuery扩展插件Validate—5添加自定义验证方法
从前面的示例中不难看出validate中自带的验证方法足以满足一般的要求,对于特别的要求可以使用addMethod(name,method,message)添加自定义的验证规则,下面的示例中添加了一个 ...
- jQuery Validate自定义各种验证方法(转)
一.封装自定义验证方法-validate-methods.js /***************************************************************** j ...
- jquery validate 自定义验证方法
query validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方法 ...
- jqery validate、validate自定义验证方法 + jaery form Demo
校验规则 required:true 必输字段 remote:"check.php" 使用ajax方法调用check.php验证输入值 email:true 必须输入正确格式 ...
- Ubuntu 固态硬盘 4K对齐及启用 Trim,及其验证方法
因为之前一个移动硬盘因为坏道蔓延导致没办法继续使用,我略冲动地跑去买了一块 120GB 的三星840 固态硬盘回来.为了使用起来更方便,还去弄了个光驱位硬盘托架,把固态硬盘接在了光驱位与原本的笔记本硬 ...
- jquery validate 自定义验证方法 日期验证
jquery validate有很多验证规则,但是更多的时候,需要根据特定的情况进行自定义验证规则. 这里就来聊一聊jquery validate的自定义验证. jquery validate有一个方 ...
随机推荐
- 在windows7中使用计划任务命令SCHTASKS查询计划任务失败的解决方案
造成这种原因是因为编码问题: 因此需要修改编码:chcp schtasks.exe /query 会报错 错误: 无法加载列资源. 修改编码为936为436就可以允许啦,但是中文不不能显示啦. ...
- Spring事务配置的五种方式(转发)
Spring事务配置的五种方式(原博客地址是http://www.blogjava.net/robbie/archive/2009/04/05/264003.html)挺好的,收藏转发 前段时间对Sp ...
- IE浏览器打开 「兼容性视图」
有些IE上的网页控件需要打开兼容性视图才能使用,不知道是Javascript的原因,还是CSS的原因. 使用环境是用C语言配合boa服务器实现的CGI程序.
- office2013发布博客
0, 喜欢用world记笔记,并查上一些配图.但是再想重新发到博客上,图片不得不重新上传十分蛋疼. world直接发布博客功能太棒了,直接绑定账号和url就可以发送了,爽YY!!! 1,新建一个博客文 ...
- 《QQ欢乐斗地主》山寨版
使用Cocos2d-x编写,模仿<QQ欢乐斗地主>的界面实现了一个具有简单AI的单机版斗地主游戏. 游戏的详细说明请查看游戏目录下的help.txt文件. 下载地址: http://dow ...
- 手动从浏览器中获取 cookie
以 chrome 浏览器为例 1) 浏览器登陆人人网并打开一个人人网页面 2)打开 开发者工具,快捷键 Ctrl + Shift + I(大写 i) 3)切换到 console 页,输入 docume ...
- Linux 配置
零:个性化 主题:Radiance 主题颜色: gtk-color-scheme = "base_color:#CCE8CF\nfg_color:#006400\ntooltip_fg_co ...
- 对整站的a链接进行监控,对匹配规则进行指定页面的跳转
项目中有个需求,就是将非本站的链接跳转到过渡页(提示即将离开本站的那种页面).这个时候想起了腾讯邮箱,不安全链接会有新的页面提示,如下图: 本以为ASP.NET中有全局的方法获取到点击或者跳转的链接, ...
- DTCMS中部分IE8不支持webupload上传附件的控件,更改为ajaxfileupload
dialog\dialog_attach.aspx <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- 在AWS上安装laravel框架
博客已经迁移到www.imyzf.com,本站不再更新,请谅解! Laravel是现在非常热门的PHP框架,这几天我试着在亚马逊AWS的服务器上安装Laravel,遇到很多问题,最后还是成功了.我的系 ...