知识大全 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

相关参考

知识大全 ibatis+spring 集成

  作为开源的Orm对象映射框架ibatis是一个线程安全学习容易但是开发相对于hibernate来说的话就要繁锁些没有很好的工具支持ibatis所有的配置几乎是通过手写这样增加了开发者的难度好啦言归

知识大全 SSH集成开发面试问题

SSH集成开发面试问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!使用strust写出处理中文乱

知识大全 JAVA SSH框架

JAVASSH框架  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Artic

知识大全 Spring MVC框架的高级配置(下)

SpringMVC框架的高级配置(下)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  上文介绍S

知识大全 Spring框架下实现基于组的用户权限管理

Spring框架下实现基于组的用户权限管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在几乎所有

知识大全 Spring AOP 详解

SpringAOP详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此前对于AOP的使用仅限于

知识大全 浅析Spring.net中的Aop使用

浅析Spring.net中的Aop使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 开源技术分析:AOP和Spring事务处理

开源技术分析:AOP和Spring事务处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什

知识大全 Spring3.0中的AOP配置方法

Spring3.0中的AOP配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一种配置方

知识大全 spring aop中单独代理和自动代理的设置

  spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理  单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De