AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等。
看一个简单的例子:
定义一个简单的切面CommonAspect
/**
* AOP拦截类,主要定义拦截点,切面拦截可以使用多个拦截点。
*/
@Component
@Aspect
public class CommonAspect {
/**
* 切入点。
*/
@Pointcut("within(com.wjy.crm.common..*)")
public void commonPackage() {
}
/**
* 使用环绕通知对用户操作做简单的权限检查
* @param joinPoint
* @return
*/
@Around("commonPackage()")
public Object userCheck(ProceedingJoinPoint joinPoint) {
return securityCheckUtil.userCheck(joinPoint);
}
private SecurityCheckUtil securityCheckUtil;
public SecurityCheckUtil getSecurityCheckUtil() {
return securityCheckUtil;
}
public void setSecurityCheckUtil(SecurityCheckUtil securityCheckUtil) {
this.securityCheckUtil = securityCheckUtil;
}
}
----------切面拦截的具体实现类
@Component("securityCheckUtil")
public class SecurityCheckUtil {
private static final Logger log = Logger.getLogger(SecurityCheckUtil.class);
/**
* Check 是否是系统用户.
*/
public Object userCheck(ProceedingJoinPoint joinPoint) {
return checkUser(joinPoint,2,"此用户不是系统用户!");
}
/**
* 得到返回对象.
*/
@SuppressWarnings("unchecked")
private Object getReturnObject(ProceedingJoinPoint joinPoint) {
Object result = null;
try {
MethodInvocationProceedingJoinPoint point = (MethodInvocationProceedingJoinPoint)joinPoint;
MethodSignature signature = (MethodSignature)point.getSignature();
Class c = signature.getReturnType();
result = c.newInstance();
} catch (Exception e) {
return null;
}
return result;
}
/**
* 设置返回对象的属性值
*/
private Object initObject(Object bean,String message) {
try {
BeanUtils.setProperty(bean, "success", false);
BeanUtils.setProperty(bean, "info", message);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return bean;
}
/**
* 获得用户对象
*/
private User getUser(ProceedingJoinPoint joinPoint) {
HeclaUser user = null;
Object[] args = joinPoint.getArgs();
for(Object obj:args) {
if(obj instanceof User) {
user = (User)obj;
break;
}
}
return user;
}
/**
* 进行用户简单权限检查
*/
private Object checkUser(ProceedingJoinPoint joinPoint,int userType,String message) {
log.debug(String.format("开始拦截%s方法,检查用户是否冻结或者注销!", joinPoint.getSignature()));
Object result = null;
User user = getUser(joinPoint);
Object resultVoid = getReturnObject(joinPoint);
log.error(String.format("开始检查用户权限:%s", user==null?"":user.getNickName()));
try {
if(null != user) {
if(null == user){
return initObject(resultVoid,"此用户不存在!");
}
if(null == user.getChannelType() || user.getChannelId() == null){
return initObject(resultVoid,"此用户已被注销!");
}
if(user.getChannelType() == userType){
return initObject(resultVoid,message);
}
if(user.getChannelType() == 2 && user.getPointId() == null){
return initObject(resultVoid,"此用户已被注销!");
}
}
result = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
log.error(String.format("检查用户权限:%s结束", user == null ? null : user.getNickName()));
return result;
}
}
----------下面是AOP的一些基本概念知识
切面(Aspect):对横切关注点的抽象,这个关注点可能会横切多个对象, 上面简单例子的CommonAspect就是一个切面,可以由@Aspect注解定义一个bean对象为切面对象。
连接点(JoinPoint):被拦截到的点,程序执行过程中的某一方法,例子里面com.wjy.crm.common包下面的所有方法
切入点(Pointcut):对哪些连接点进行拦截的定义例子用@Pointcut("within(com.wjy.crm.common..*)")来定义切入点。
通知(Advice):在特定的连接点,AOP框架执行的动作.包括前置通知(在JoinPoint之前执行的通知)、后置通知(JoinPoint退出的时候执行的通知)、例外通知(方法抛出异常退出是的通知)、最终通知(JoinPoint正常完成后执行的通知)和环绕通知(环绕通知在一个方法执行之前和之后执行。它使得通知有机会既在一个方法执行之前又在执行之后运行)。本例用的是环绕通知
引入(Introduction):添加方法或字段到被通知的类。 Spring允许引入新的接口到任何被通知的对象。
目标对象(Target Object):被一个或者多个切面所通知的对象。
AOP代理(AOP Proxy):AOP框架创建的对象,在Spring AOP中有两种代理方式,JDK动态代理和CGLIB代理。
织入(Weaving):组装方面来创建一个被通知对象。这可以在编译时 完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样, 在运行时完成织入。
相关推荐
在本示例中,我们将深入探讨如何利用Spring AOP实现简单的权限验证。 首先,AOP的核心概念是切面(Aspect),它封装了横切关注点,比如日志、事务管理、权限验证等。在Spring AOP中,切面通过通知(Advice)来定义...
1. 使用Filter:通过过滤器对所有请求的URI进行解析,获取用户的权限信息,并基于角色基础访问控制(RBAC)原则,比较用户权限和所需操作的权限,做出是否允许访问的决定。这种方式简单易行,但可能受到URL驱动操作...
以下是如何在Spring中使用AOP实现权限校验的步骤: 1. **定义切面(Aspect)**:首先,创建一个带有`@Aspect`注解的类,这个类就是我们的切面。在这个类中,我们可以定义切点和通知。 2. **定义切点(Pointcut)**...
5. **动态数据过滤**:除了简单的允许/拒绝访问,我们还可以实现更复杂的数据过滤,如根据用户角色返回特定范围的数据。例如,销售人员只能看到他们自己的销售记录,而经理能看到所有销售记录。这可以通过在查询中...
一个简单的采用自定义注解结合SpringAop实现方法执行的权限管理,这个demo中并没有涉及到与数据库的交互和业务代码,用户权限在登陆时采用简单的手动初始化。该demo用的jdk1.7编译,Spring4.0版本,只想通过这个demo...
SpringBoot 使用 AOP+注解实现简单的权限验证的方法 SpringBoot 框架提供了强大的权限验证机制,以确保应用程序的安全性。其中一种方法是使用 AOP(Aspect-Oriented Programming)和注解来实现简单的权限验证。本文...
标题中的"AOP-CGLIB学习-实现简单的注解权限系统"指的是使用Spring的面向切面编程(AOP)特性,结合CGLIB库来创建一个基于注解的权限控制系统。在这个系统中,通过CGLIB动态代理技术,可以对带有特定注解的方法进行...
以标题和描述中的"SuperAop-master"为例,这可能是一个开源项目,它提供了一种无侵入式的AOP实现方式。"无侵入"意味着这种工具不会改变原有业务逻辑的代码结构,开发者只需通过定义特定的注解,就可以实现AOP的功能...
以下是对"简单的AOP实现"的详细解读。 1. **AOP概念**: - 切面(Aspect):AOP的核心概念,包含业务逻辑和横切关注点。切面定义了感兴趣的点(例如方法调用),以及如何处理这些点。 - 连接点(Join Point):...
在Spring Security中,我们可以使用AOP来实现方法级别的访问控制,这意味着我们可以指定只有具备特定权限的用户才能调用特定的方法。 3. **配置Spring Security 2.0** 在Spring Security 2.0中,我们需要在Spring...
"关于用户权限的数据库设计" 本文讨论了数据库设计中用户权限的设计问题,特别是基于基本权限功能的设计。文章首先介绍了项目中权限控制的需求,接着讨论了 zwei 疑惑:一是是否应该在底层截取用户权限,控制用户对...
在Java中,Spring框架提供了强大的AOP支持,但Struts2也提供了一种简单的AOP实现,主要用于拦截Action执行前后的操作,比如日志记录、事务管理等。 在Struts2中实现AOP主要通过自定义拦截器来完成。首先,我们需要...
4. **用户权限组中间表 (admin_privilegegroup)**:记录用户与权限组的多对多关系,以此实现权限的分配。 此外,还设计了一个名为`Privilege`的权限类,利用Java 5.0的注解特性,标记需要进行权限过滤的方法,并...
这些接口可以用于实现简单的权限检查,但它们无法处理需要返回值的情况,比如在权限验证失败时,我们需要中断方法的执行并返回一个特定的结果。 为了更灵活地处理这种情况,我们可以使用`MethodInterceptor`接口。`...
代码实现简单,易于维护:使用 Spring AOP 可以将耗时监测的逻辑与业务逻辑进行解耦,避免业务逻辑代码的冗余和代码维护难度的提高。 2. 安全性高:使用 Spring AOP 进行方法耗时监测,可以在不修改业务逻辑代码的...
4. **安全性检查**: 在方法调用前进行权限验证,确保只有授权的用户或服务才能执行特定操作。 **总结** AOP Alliance作为面向切面编程的桥梁,简化了多个AOP框架之间的交互,提高了代码的可复用性和模块化。通过...
本文将深入浅析Spring AOP在权限管理中的应用,结合标签"源码"和"工具",我们将探讨如何利用Spring AOP实现精细的权限控制,并通过具体的代码示例来理解这一过程。 Spring AOP(Aspect Oriented Programming)是...
2. **控制权限**:AOP可以用来实现细粒度的访问控制。例如,我们可以在方法执行前后添加检查,确保只有具有相应权限的用户才能访问。这可以避免在每个业务方法中重复权限验证的代码,提升代码的可读性和可维护性。 ...
4. **前置通知**:在目标方法执行前检查用户权限,如果权限不足,则抛出异常或返回错误信息。 5. **异常通知**:捕获因权限不足导致的异常,可以提供友好的错误提示。 **四、AOP在日志记录中的应用** 1. **日志...