`

使用Spring的AOP拦截DispatchAction

阅读更多
红色部分是个人心得

最近做的一个项目中对权限要求比较高,对系统每个模块的不同操作(CRUD)分别设置权限,当然用户还有角色,多对多的关系,默认用户继承所拥有的角色(按优先级从高到低)的权限,也可以对用户单独授权,整体采用RBAC模型,ACL的主体可以为角色也可以为用户,做完授权后,下一步的问题时:如何及时认证呢?三个参数(用户ID, 资源ID, 操作permission) ,因为UI层使用Struts,用户登陆后可以在request中获取session,进而获取用户ID,资源ID可以从request的servletPath中URL查出,剩下的就是操作了,这是最关键的一点。

    系统的命名规范是(C)--->add... / (R)--->find/   (U)--->modify...   / (D)--->del.. 针对每个模块编写一个Action继承BaseAction,BaseAction继承DispatchAction,在你要拦截的DispatchAction中重写execute()方法,否则拦截不到,重写的方法我会在下面贴出来.完成用户登陆验证后交由DispatchAction根据parameter执行任务分发,说到这里就会想到用Spring的AOP来对所有的Action进行拦截,然后定义pointcut为这些Action的add..或 del...开头的方法,在根据pointcut定义不同的adviser,对应的adviser中规定好对应的permission(第三个参数),在结合从JoinPoint中获取的request,得到前两个参数完成及时认证。想法不错,然而做起来的时候,却不是那么回事,因为所有的Action都是DispatchAction,所有的方法(非execute())均为反射调用,所以根本拦截不到其他的跟业务逻辑相关的add..或 del...开头的方法,所以,现在的问题是:如何用AOP对DispatchAction中的不同方法进行拦截?

    分析Struts的执行过程和DispatchAction的原理就知道,拦截DispatchAction的execute()方法,在adviser中做DispatchAction中的一些类似的处理,比如获取parameter和methodName,得到了methodName,不就可以设置permission了吗!

核心的代码贴出来,Aspect如下:


AuthImpl.java
package com.bluesun.oa.manager.impl;

/* import ... */

public class AuthImpl implements Auth {

private ACLManager aclManager;

public void authPermission(JoinPoint joinPoint) {
   Object[] args = joinPoint.getArgs();
   ActionMapping mapping = (ActionMapping) args[0];
   ActionForm form = (ActionForm) args[1];
   HttpServletRequest request = (HttpServletRequest) args[2];
   HttpServletResponse response = (HttpServletResponse) args[3];

   String parameter = mapping.getParameter();
   if (parameter == null) { // 非DispatchAction, 无需检查权限
    return;
   }

   String methodName = request.getParameter(parameter);
   int permission = -1;

  if (methodName == null) { // unspecified()方法
    permission = Permission.READ;
   } else if (methodName.startsWith("add")) {
    permission = Permission.CREATE;
   } else if (methodName.startsWith("modify")) {
    permission = Permission.UPDATE;
   } else if (methodName.startsWith("del")) {
    permission = Permission.DELETE;
   } else {
    return; // 其他情况不做检查
   }

   User user = (User) request.getSession().getAttribute("login");
   if (user == null) {
    return;   //用户没登陆,不检查权限,交由BaseAction处理
   }

   String path = request.getServletPath();
   String moduleUrl = null;
   if (path != null && path.length() > 1) {
    moduleUrl = path.substring(1);
   }

   if (!aclManager.hasPermission(user.getId(), moduleUrl, permission)) {
    throw new SystemException("对不起,您无权执行此操作,请联系管理员! [color=red][b]这里一定要抛异常,因为无法跳转,跳转回出错.抛出异常后,用用户自定义异常处理方式处理,在处理方法中可以让其跳到指定页面.[/b][/color]username:" + user.getUsername());
   }
}

public void setAclManager(ACLManager aclManager) {
   this.aclManager = aclManager;
}

}



AOP的配置:

applicationContext.xml
<bean id="auth" class="com.bluesun.oa.manager.impl.AuthImpl">
   <property name="aclManager" ref="aclManager"/>
</bean>

/ *       more code       */

<aop:config proxy-target-class="true">
   <aop:aspect id="authAspect" ref="auth">
    <aop:pointcut id="authP" expression="execution(* com.bluesun.oa.web.actions.*.execute(..))"/>
    <aop:before pointcut-ref="authP" method="authPermission"/>
   </aop:aspect>
</aop:config>




重写execute
	
public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception{
                //这里可以写一些你的处理代码,不写也可以
		ActionForward af = super.execute(mapping, form, request,response);
		SaveErrors(request);
		return af;
分享到:
评论

相关推荐

    springboot+aspect实现springaop拦截指定方法.zip

    SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    本节将详细介绍如何使用Spring AOP实现流程日志跟踪,主要关注于如何通过AOP拦截特定的类和方法来进行日志记录。 ##### 3.1 配置Spring AOP 在Spring配置文件中定义切面和切入点表达式是非常关键的一步。一般来说...

    springaop拦截controller日志

    "springaop拦截controller日志"这个主题旨在讲解如何使用Spring AOP来拦截Controller层的方法调用,并在方法执行前后记录相关日志。 首先,了解Spring AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”...

    spring aop 拦截实例

    在"spring aop 拦截实例"中,我们通常会看到以下步骤: 1. **配置AOP**:在Spring配置文件中启用AOP并注册切面类。 2. **定义切面**:创建一个Java类,使用`@Aspect`注解,并定义切入点表达式和通知方法。 3. **...

    springboot spring aop 拦截器注解方式实现脱敏

    在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...

    Spring使用AOP的三个jar包

    要使用Spring的AOP功能,我们需要引入特定的库,这正是标题中提到的"Spring使用AOP的三个jar包"。 首先,我们来看`aspectjrt.jar`。这个库是AspectJ运行时环境的一部分,包含了运行时织入(runtime weaving)所需的...

    spring AOP拦截方法小示例

    这个“spring AOP拦截方法小示例”是一个实际应用,展示了如何使用Spring AOP来拦截特定层的所有方法,并在调用前后以及出现异常时执行自定义逻辑。 首先,让我们了解AOP的基本概念。AOP的核心是切面(Aspect),它...

    在自定义spring aop中使用el获取拦截方法的变量值。

    标题中的“在自定义Spring AOP中使用EL获取拦截方法的变量值”指的是在Spring的面向切面编程(AOP)中,通过Expression Language(EL,表达式语言)来访问被拦截方法的局部变量值。这通常涉及到Spring的代理机制、...

    Spring AOP 拦截器 Advisor

    Spring AOP 拦截器 Advisor 是 Spring 框架中的一个重要概念,它与切面编程密切相关,用于实现细粒度的控制和增强应用程序的行为。在 Spring AOP 中,Advisor 是一个组合了通知(Advice)和切入点(Pointcut)的对象...

    spring aop jar 包

    在项目中,我们通常会将这个jar包引入到类路径下,以便使用Spring AOP的功能。 总的来说,Spring AOP通过提供面向切面的编程能力,极大地提高了代码的可复用性和可维护性,降低了系统复杂度,特别是在处理共性问题...

    详解Spring AOP 拦截器的基本实现

    Spring AOP使用代理模式和动态代理技术来拦截方法调用,根据切点表达式匹配的方法会触发定义的通知。 权限管理、事务管理、安全管理、日志管理和调试管理是AOP在实际项目中常见的应用场景。这些通常不需要与业务...

    spring aop 拦截器简单实现

    在Spring AOP中,拦截器扮演着关键角色。它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring AOP 中,`ObjenesisCglibAopProxy` 类负责使用 CGLIB 创建代理对象,它会将一系列的 `MethodInterceptor` 注册为 `Callback`,这些 `MethodInterceptor` 执行了 AOP 的逻辑。 在 Spring AOP 的自动代理...

    mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类

    例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...

    spring aop 拦截日志示例

    通过以上步骤,我们就完成了使用Spring AOP拦截并记录系统操作日志和异常日志的过程。在实际项目中,可以根据需求调整切点表达式,优化日志格式,以及对日志进行分类和分级存储。这样的设计使得日志管理变得灵活且...

    Spring AOP 16道面试题及答案.docx

    Spring AOP,全称为Aspect Oriented Programming,是面向切面编程的一种编程范式,它是对传统的面向对象编程(OOP)的一种补充。在OOP中,核心是对象,而在AOP中,核心则是切面。切面是关注点的模块化,即程序中的...

    ssh2登陆+spring aop做拦截

    SSH2 登录与 Spring AOP 拦截是两种在 IT 领域中常见的技术,主要用于提升系统安全性和管理效率。SSH2(Secure Shell version 2)是一种网络协议,用于提供安全的远程登录和数据传输,而 Spring AOP(Aspect ...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    Spring AOP完整例子

    在本教程中,我们将深入探讨Spring AOP的不同使用方法,包括定义切点、通知类型、组装切面以及使用JUnit4进行测试。 首先,我们需要理解Spring AOP的基础概念。AOP的核心是切点(Pointcut),它定义了关注点在何处...

    spring aop依赖jar包

    在Spring 2.5.6版本中,使用Spring AOP通常需要以下核心jar包: - `spring-aop.jar`:这是Spring AOP的核心库,包含了AOP相关的类和接口。 - `spring-beans.jar`:Spring Bean容器的实现,提供了Bean的定义、实例化...

Global site tag (gtag.js) - Google Analytics