知识大全 SSH集成框架下真正实现Spring AOP拦截功能
Posted 权限
篇首语:与天地兮比寿,与日月兮齐光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SSH集成框架下真正实现Spring AOP拦截功能相关的知识,希望对你有一定的参考价值。
SSH集成框架下真正实现Spring AOP拦截功能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
问题的提出
在Struts 框架下 有三种类型的Action控制器 分别是MappingDispatchAction DispatchAction和Action 他们是依次继承 最终执行的execute方法 但MappingDispatchAction DispatchAction的子类中没有execute方法 只有参数指定的具体方法 而这些方法是被MappingDispatchAction DispatchAction本类的execute方法调用执行 特别注意的是它是通过反射机制来做的(大家可以看看DispatchAction类的源代码) 所以这些被反射调用的方法是不能被Spring AOP拦截的 因此也就无法利用切面编程实现权限控制了
解决方法
巴巴运动网通过覆蓋DelegatingRequestProcessor控制器的processActionPerform方法 是一种理想的解决方案 但严格来说并不是AOP切面编程方法 因此笔者仅从学习AOP切面编程的角度来提出本文章 对于实用性笔者极力推荐巴巴运动网的方案
本方法解决思想
覆蓋execute方法 再模仿DispatchAction反射调用具体的方法
实现Spring AOP拦截点 开始拦截配置描述的范围内的程序
在切入点程序中再次实现反射机制 获取执行方法上的权限配置信息
根据权限信息决定放行还是返回
最终既可以拦截到execute方法 也可以得到具体方法中的权限注解配置信息 以本BBS系统为例
第一步 凡继承于DispatchAction的类都覆蓋execute方法
@Override public ActionForward execute(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws Exception return super execute(mapping form request response); //假如这个action中有一个具体的方法 @Privilege(userType=PrivilegeType Admin message= 需管理员权限! ) public ActionForward addUI(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response) throws Exception CategoryForm categoryForm = (CategoryForm)form; categoryForm setTitle( 新增分类 ); return mapping findForward( addUI );
第二步 做自己的权限配置
看上面addUI方法上的注解应该可以理解这些配置
@Retention(RetentionPolicy RUNTIME) @Target(ElementType METHOD) public @interface Privilege String message() default 您没有权限执行该操作 请登录后重试! ; PrivilegeType userType();
配置中有个字字段是枚举 源码如下
public enum PrivilegeType LoginUser public String getName() return 所有登录用户 ; public int getValue() return ; LoginUserSelf public String getName() return 登录用户自己 ; public int getValue() return ; Moderator public String getName() return 版主 ; public int getValue() return ; Admin public String getName() return 管理员 ; public int getValue() return ; ; public abstract String getName(); public abstract int getValue();
第三步 实现AOP切入编程
@Aspect @Component() public class PrivilegeAction //拦截 zjh包下(含子包)所有类能返回ActionForward类型的方法 @Around( execution( apache struts action ActionForward zjh * *( )) ) public Object validatePrivilege(ProceedingJoinPoint pjp) throws Throwable // 从拦截的方法中参数中得到四个对象 ActionMapping mapping = (ActionMapping) pjp getArgs()[ ]; ActionForm form = (ActionForm) pjp getArgs()[ ]; HttpServletRequest request = (HttpServletRequest) pjp getArgs()[ ]; HttpServletResponse response = (HttpServletResponse) pjp getArgs()[ ]; //从拦截点处获取它所处的类名 并经过反射取得权限配置信息 Class dispatchAction = Class forName(pjp getSignature() getDeclaringTypeName()); Object obj = dispatchAction newInstance(); String mappingParament = mapping getParameter()==null ? execute : request getParameter(mapping getParameter()); Method method = obj getClass() getDeclaredMethod(mappingParament ActionMapping class ActionForm class HttpServletRequest class HttpServletResponse class); Privilege privilege = method getAnnotation(Privilege class); //如果方法上没有配置权限信息 直接放行 if(privilege==null) return (ActionForward)pjp proceed(); //否则必须是登录用户 进行第一关粗粒度拦截 User user = WebUtil getUserInSession(request); if(user==null) request setAttribute( message ssage()); return mapping findForward( message ); //再根据用户类型进行细粒度拦截 switch(privilege userType() getValue()) //当权限为PrivilegeType LoginUserSelf(登录用户自己 例如更新文章必须是自 //己的文章才有权限更新)时 须从数据库里取得用户对象再和session中用 //户匹配 这个没有实现 case : if(!user getUsername() equals( 数据库里取得某文章的用户名 )) request setAttribute( message ssage()); return mapping findForward( message ); break; //版主权限拦截 这个没有实现 case : request setAttribute( message ssage()); return mapping findForward( message ); //管理员权限 从application取得管理员用户名 再匹配session登录用户是否相等 case : String admin = ((SystemProperty)request getSession() getServletContext() getAttribute( config )) getAdminUsername(); if(!user getUsername() equals(admin)) request setAttribute( message ssage()); return mapping findForward( message ); break; //当上面没有拦住 表示权限允许 放行 return (ActionForward)pjp proceed();
cha138/Article/program/Java/ky/201311/28601相关参考
作为开源的Orm对象映射框架ibatis是一个线程安全学习容易但是开发相对于hibernate来说的话就要繁锁些没有很好的工具支持ibatis所有的配置几乎是通过手写这样增加了开发者的难度好啦言归
SSH集成开发面试问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!使用strust写出处理中文乱
JAVASSH框架 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Artic
SpringMVC框架的高级配置(下) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 上文介绍S
Spring框架下实现基于组的用户权限管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在几乎所有
SpringAOP详解 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 此前对于AOP的使用仅限于
浅析Spring.net中的Aop使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &
开源技术分析:AOP和Spring事务处理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一为什
Spring3.0中的AOP配置方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 第一种配置方
spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理 单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De