转自:http://zhanghua.1199.blog.163.com/blog/static/464498072011111393634448/
1 首先这是切面类,实现对所有action方法进行拦截
@Aspect
@Component
public class PrivilegeInterceptor {
@Pointcut("execution(java.lang.String com.my.web.action..*.*(..))")
private void actionMethod() {
}
@Around("actionMethod()")
public Object interceptor(ProceedingJoinPoint pjp) throws Throwable {
//System.out.println("开始拦截到了" + pjp.getSignature().getName() + "方法");
HttpServletRequest request=getRequet(pjp);
if(!validate(pjp,request)){
request.setAttribute("message", "您没有执行该操作权限");
request.setAttribute("urlAddress", "/control/right");
return "global-message";
}
return pjp.proceed();
}
/**
* 验证是否有权限执行方法
* true 代表可以执行
* false代表没有权限执行
* @return
*/
private boolean validate(ProceedingJoinPoint pjp,HttpServletRequest request) {
if(!isNeedCheck(request)){
return true;
}
SystemPrivilege methodPrivilege=getExeMethodPower(pjp);
if(methodPrivilege==null){
return true;
}
Employee employee=getEmployee(request);
for(PrivilegeGroup group:employee.getGroups()){
if(group.getPrivileges().contains(methodPrivilege)){
return true;
}
}
return false;
}
/**
* 得到当前登录的员工
* @param request
* @return
*/
private Employee getEmployee(HttpServletRequest request) {
return WebUtil.getEmployee(request.getSession());
}
/**
* 获取当前拦截对象的request请求对象
* @param pjp
* @return
*/
private HttpServletRequest getRequet(ProceedingJoinPoint pjp) {
Object target=pjp.getTarget();
HttpServletRequest retValue;
try {
Method reqMethod=target.getClass().getMethod("getRequest");
retValue=(HttpServletRequest) reqMethod.invoke(target);
} catch (Exception e) {
return null;
}
return retValue;
}
/**
* 获取路经,以判断是否需要进行权限验证
* true 需要验证
* false 不需要验证
* @param request
* @return
*/
private boolean isNeedCheck(HttpServletRequest request){
if(WebUtil.getRequestURI(request).startsWith("/control/")){
return true;
}
return false;
}
/**
* 获取执行目标方法所需要的权限
* @return
*/
private SystemPrivilege getExeMethodPower(ProceedingJoinPoint pjp){
MethodSignature joinPointObject=(MethodSignature) pjp.getSignature();
Method method = joinPointObject.getMethod();
Permission permi=method.getAnnotation(Permission.class);
if(permi==null){
return null;
}
SystemPrivilege methodPrivilege=new SystemPrivilege();
SystemPrivilegePK spk=new SystemPrivilegePK(permi.module(), permi.privilege());
methodPrivilege.setId(spk);
return methodPrivilege;
}
}
详细介绍以上获得来源
// 获取连接点的方法签名对象
MethodSignature joinPointObject = (MethodSignature) jp.getSignature();
// 连接点对象的方法
Method method = joinPointObject.getMethod();
// 连接点方法方法名
String name = method.getName();
Class<?>[] parameterTypes = method.getParameterTypes();
// 获取连接点所在的目标对象
Object target = jp.getTarget();
// 获取目标方法
method = target.getClass().getMethod(name, parameterTypes);
// 返回@AroundPointCut的注释对象
AroundPointCut joinPoint = method.getAnnotation(AroundPointCut.class);
注解代替表
@Retention(RetentionPolicy.RUNTIME)//表进运行时仍然有这个注解
@Target(ElementType.METHOD)//表示只能放在方法上
public @interface Permission {
String module();//要执行的模块
String privilege();//执行模块具体动作
}
3.一定要在struts2里的xml配置文件里加入以下几句,否则spring无法帮你注入
<constant name="struts.ui.theme" value="simple"></constant>
4.要在spring文件里配置spring容器支持注解切面
<aop:aspectj-autoproxy />
、但这样我的程程序还是报错了,我想可能是版本的问题,如果级别高的话就应该不用了,要加上一句,
完整写法:
<aop:aspectj-autoproxy proxy-target-class="true"/>
相关推荐
本教程将探讨如何在Spring中结合AspectJ实现AOP,包括基于XML配置和基于注解的方式。 **一、AOP基本概念** AOP的核心概念有切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)和引入...
SpringBoot结合AspectJ实现SpringAOP拦截指定方法的知识点涵盖了多个方面,这包括Spring AOP的基本概念、SpringBoot的应用、切点(Pointcut)与通知(Advice)的定义、自定义注解以及AspectJ的使用。以下是这些知识...
Spring框架的AOP(面向切面编程)是其核心特性之一,它提供了一种在不修改代码的情况下,对程序进行横向关注点(如日志、事务管理、权限控制等)插入的方法。本实例将深入探讨如何使用XML配置和@AspectJ注解两种方式...
8. **类型匹配(Type Matching)**:AspectJ的强项之一是类型匹配能力,它允许你基于类或接口来定义切入点,而不仅仅是方法签名,这比Spring AOP的基于方法签名的切入点更灵活。 9. **注解驱动(Annotation-Based)...
在Spring Boot应用中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们创建横切关注点,如日志记录、权限检查等,这些关注点可以被编织到应用程序的多个点上,而无需侵入核心业务逻辑。在本案例中,我们将...
例如,可能会有一个自定义的MyBatis拦截器用于分页查询,一个Spring AOP切面用于记录操作日志,Spring事务管理确保数据的一致性,而反射工具类可能用于动态加载配置或处理某些通用的反射任务。通过这些组件的组合,...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...
在本案例中,我们将探讨如何使用AspectJ注解来开发Spring AOP。 首先,我们要了解Spring AOP的主要目标是为方法调用提供拦截机制,也就是在方法执行前、后或发生异常时执行特定的操作。这通常被称为通知(advises)...
本篇内容将对Spring AOP中基于AspectJ注解的使用进行总结,并通过实际案例进行解析。 首先,让我们理解AspectJ注解在Spring AOP中的核心概念: 1. **@Aspect**: 这个注解用于定义一个类为切面,这个类将包含切点和...
AOP拦截器在Spring中主要通过`HandlerInterceptor`接口或者`@AspectJ`注解来实现。下面我们将详细探讨这两种实现方式。 1. **基于`HandlerInterceptor`的拦截器** - `HandlerInterceptor`是Spring MVC中的一个接口...
Spring AOP和其他AOP框架(如AspectJ)都实现了这些接口,以实现方法拦截和通知机制。 2. aspectjweaver-1.7.0.jar:这是AspectJ的织入器,负责在运行时动态地将切面(aspect)织入到目标类中。AspectJ提供了一种...
本篇文章将详细探讨在Spring 2.5中使用AspectJ进行AOP开发所需的知识点。 首先,我们需要理解AOP的核心概念: 1. **切面(Aspect)**:切面是关注点的模块化,它封装了多个相关方法,这些方法在程序的不同点执行,...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...
在Spring中,我们可以使用AspectJ注解来声明切面,这些注解包括`@Aspect`、`@Before`、`@After`、`@Around`等,它们分别代表前置通知、后置通知、环绕通知等不同类型的拦截器。 1. **创建切面类** 首先,我们需要...
Spring AOP支持两种主要的通知类型:方法拦截器(基于代理的AOP)和AspectJ LTW(编译时和加载时织入)。方法拦截器是Spring AOP的基础,它通过代理模式实现,适用于Spring管理的所有bean。而AspectJ LTW提供了更...
在Spring中,引入可以通过实现`org.springframework.aop.IntroductionInterceptor`接口或使用`@AspectJ`注解的切面来完成。`IntroductionInterceptor`是一个特殊的拦截器,它不仅包含了拦截器的逻辑,还负责提供新增...
在IT行业中,Spring AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行拦截和增强。这在性能监控、日志记录、事务管理等方面尤为有用。本篇文章将深入探讨如何使用...
如果希望在没有显式声明的情况下,对所有符合切点表达式的bean进行代理,可以使用 `@ComponentScan` 的 `includeFilters` 和 `excludeFilters` 属性,结合 `@AspectJ` 注解扫描切面类,让Spring自动识别和应用切面...
基于代理的AOP主要使用JDK动态代理或CGLIB库来创建代理对象,而基于字节码的AOP则使用AspectJ库,可以在编译时或运行时修改字节码来实现切面。 `@Aspect`注解用于定义一个切面,其中可以包含多个通知方法。`@Before...
在Spring AOP中,关注点被模块化为独立的“切面”,这些切面可以在多个对象上进行编织,而无需显式地修改这些对象。下面我们将深入探讨Spring AOP的关键概念和使用方法。 1. **切面(Aspect)**:切面是关注点的...