文档章节

spring Aop 实现对http请求参数的验证,及对功能权限的验证

巡山
 巡山
发布于 2016/06/21 16:24
字数 649
阅读 148
收藏 8

Aop 面向切面编程,在java 中普遍使用动态代理和反射实现。具体的请百度。spring aop有多种方式。本次使用的是注解方式,(建议使用注解方式)。

第一步自定义了2个注解

@Target(value={ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Verify {

}

public @interface FieldVerify {

    boolean required() default true;
    
    /***
     * 数据类型primary 基本数据
     * creator mingqiang_zhou
     * createdate 2016-6-16
     * modifyor 
     * @return
     */
    String type() default "primary";    
}
 

第二步、建立AOP实现类,和spring IOC 配合使用

@Aspect
public class FunctionRightAop {
    private static Logger logger = Logger.getLogger(FunctionRightAop.class);
       
    @Around("@annotation(com.xxx.xxx.FunctionRight)")
    public Object process(ProceedingJoinPoint joinPoint) throws Throwable{
        Object[] args = joinPoint.getArgs();
        Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();

        Class<?>[] ptypes = method.getParameterTypes();
        User loginUser = null;
        int len = ptypes.length;
        for(int i = 0;i< len;i++){
            if(ptypes[i].isAssignableFrom(User.class)){
                loginUser = (User)args[i];
                break;
            }
        }
        
        String chktype = method.getAnnotation(FunctionRight.class).value();
        boolean addAble = true;

........      
        Opportunity opportunity = null;
        if(RightConstant.ACT_ADD.equals(chktype)){
            //检查添加权限
        }else{
            //需要数据进行验证权限

           。。。。
            addAble = checkAll(。。。chktype);
        }
        
        if(!addAble){
            throw new AuthException(AppCodeEnum.no_right.getCode(),AppCodeEnum.no_right.getMsg());
        }else if(!RightConstant.ACT_ADD.equals(chktype)){
            //设置获取的对象,节省再次请求数据库
            args[len-1] = new Opportunity[]{opportunity};
        }
        
        Object returnValue = joinPoint.proceed(args);
        
        return returnValue;
    }

可以看到如果在权限验证中使用了,要获取的数据,可以直接将数据当做参数传递到被调用方法中,当然在被调用方法需要定义好参数。

 

第三步、 在Aop代理中根据注解不能内容进行参数验证。

private boolean procee(Object obj){
        if(obj == null){
            return false;
        }else if(obj instanceof String&&StringUtils.isBlank((String)obj)){
            return false;
        }else if(obj instanceof List){
            List<?> objs = (List<?>)obj;
            if(objs==null||objs.isEmpty()){
                return false;
            }
        }else if(obj instanceof Map<?, ?>){
            Map<?, ?> map = (Map<?, ?>)obj;
            if(map==null||map.isEmpty()){
                return false;
            }
        }else{
            Class<?> pclass = obj.getClass();
            if(pclass.getAnnotation(Verify.class)!=null){
                Field[] fields = pclass.getDeclaredFields();
                if(fields!=null){
                    for(Field field : fields){
                        if(field.getAnnotation(FieldVerify.class)!=null){
                            field.setAccessible(true);
                            try {
                                Object propertyObj = field.get(obj);
                                boolean re = procee(propertyObj);
                                if(!re){
                                    return re;
                                }
                            } catch (IllegalArgumentException e) {
                                logger.error(e.getMessage(),e);
                                return false;
                            } catch (IllegalAccessException e) {
                                logger.error(e.getMessage(),e);
                                return false;
                            }
                        }
                    }
                }
            }
        }
        return true;
    }

这个解析是十分简单的验证十分有数据,没有对数据的具体内容进行解析验证判断,同学们有需要可以自己添加。 

上面的代码权限验证和参数验证混合在一起了,大概的流程都是产不多的。在第二步中我把权限验证需要用到的数据当做参数传递到真正的业务方法中,这样的好处是节省了在查询数据库的花费,但是与切面与业务分离的思想有违背的。大家根据具体情况使用吧。

 

 

© 著作权归作者所有

巡山
粉丝 2
博文 20
码字总数 12425
作品 0
深圳
私信 提问
Spring、Spring MVC、Struts2、、优缺点整理

Spring 及其优点 大部分项目都少不了Spring的身影,为什么大家对他如此青睐,而且对他的追捧丝毫没有减退之势呢 Spring是什么: Spring是一个轻量级的DI和AOP容器框架。 说它轻量级有一大部分...

架构师springboot
03/21
25
0
Spring 和 Django 安全机制的比较

做了一年多的python 方面的web开发工作,昨个有个同学问我Django的安全机制,我是一脸的茫然。每天使用公司开发框架的我,对这些东西了解的甚少,俨然成为一个真正的"码农",只知其然而不知其...

北方攻城师
2014/10/13
340
0
彻底征服 Spring AOP 之 实战篇

接上一小节彻底征服 Spring AOP 之 理论篇 Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识...

永顺
2017/11/29
0
0
Shiro和Spring Security对比

Shiro简介 Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大,但是在实际工作时可能并不...

有余力则学文
2018/04/27
244
1
Struts、Hibernate和Spring常见面试题的问与答

原文:http://www.java-home.com/thread-574-1-1.html Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务...

迷路的阿修罗
2010/12/03
660
0

没有更多内容

加载失败,请刷新页面

加载更多

【TencentOS tiny】深度源码分析(4)——消息队列

消息队列 在前一篇文章中【TencentOS tiny学习】源码分析(3)——队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的,那么我们今天来看看消息...

杰杰1号
3分钟前
1
0
Hive

这就是那个 JAVA 类 package cn.itcast.bigdata;import java.util.HashMap;import org.apache.hadoop.hive.ql.exec.UDF;public class PhoneNbrToArea extends UDF{privat......

Garphy
3分钟前
1
0
Springboot开发,第二天

SpringBoot学习,第二天 目录:1、Springboot整合Listener 2、Springboot访问静态资源 3、异常处理 4、热部署 一、SpringBoot整合Listener 两种方式完成组件的注册 1、通过注解扫描完成组件的...

有一个小阿飞
7分钟前
2
0
BeginnersBook Perl 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
20分钟前
2
0
我的Java秋招面经大合集

阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 然后我...

Java技术江湖
24分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部