使用Spring 的 AOP 实现权限管理
2009-11-28 14:10
501 查看
完成了前面的一些工作,准备测试一下使用AOP实现权限管理.
首先,写了一个增加版块的action,这个比较简单了,没有什么问题,只是在写代码的过程中没有注意大小写,花了点时间而己.
接着写一个Interceptor类,并将其定义为切面,使用@Aspect,同时将其交给spring管理,使用@Component注解.代码如下:
@Component
@Aspect
public class LoginInterceptor {
// @PointCut("execution(* bbs.web.action..*.*(..))") 第一个*返回类型 ..当前包及子包
// 第二个*类,第三个*方法,接下的..任意参数
@Pointcut("execution(* bbs.web.action..B*.*(..))")
private void anyMethod() {
}
@Around("anyMethod()")
public String isLogin(ProceedingJoinPoint jp) throws Throwable {
// TODO Auto-generated method stub
User user = (User) ActionContext.getContext().getSession().get("user");
if (user == null)
return "login";
return (String) jp.proceed();
}
}
使用环绕通知(around advice).拦截BoardAction
这一些操作都比较简单了,第一次运行,出现了没有指定方法的错误,仔细分析后,想起了,有一种AOP是使用接口创建代理对象实现的,但我的BoardAction并没有使用接口编程,于是,将BoardAction中抽取一个接口,让BoardAction实现这个接口.测试后成功,会跳到登录窗口.
同时,又想到,还有一种AOP,是通过子类的方法创建代理对象的,它使用cglib的jar包,上网查了一下,只要在<aop:aspectj-autoproxy proxy-target-class="true" />这个配置中使用proxy-target-class="true" 就可以了,测试成功.
总结:spring默认使用接口创建代理对象实现AOP,如果不使用接口编程,可以使用cglib,通过子类实现AOP,做如上配置即可.
使用cglib用到的jar包 在spring 的 lib/cglib下.
但是当登录成功后,运行addboard.jsp,提交内容后,执行BoardAction的add方法时,出现了错误,大致内容是board.name是空.仔细分析后发现,并没有把addboard.jsp post 到 action的一些参数,映射到BoardAction的private Board board;属性.
上网找了很久很久,没有任何结果.有类似错误的贴子,都没有解决方法.
这里简单分析一下:
Struts2,通过拦截器,拦截到对action的请求,并将其参数映射给action 的成员变量
而Spring通过AOP,创建了一个代理类,它是action的子类,这个子类的名称是随机产生的(通过查看出错信息可以看到,每次出错的类并不一样,前缀就是action的类名)
at bbs.web.action.BoardAction$$EnhancerByCGLIB$$24e41fc4.add(<generated>) 这句是错误信息,通过这个类别就可以明白,这是一个由CGLIB产生的类,它是bbs.web.action.BoardAction的子类,出错是在它的add方法。
not-null property references a null or transient value: bbs.domain.bean.Board.name 这句是错误。
当web client提交信息时,实际上执行到的是action的那个代理类,而不是action本身,而struts2并没有向代理类映射相应的参数值.
如何解决呢?研究中。。。。当然,不用AOP,使用struts2的拦截器也一样可以实现权限控制。
首先,写了一个增加版块的action,这个比较简单了,没有什么问题,只是在写代码的过程中没有注意大小写,花了点时间而己.
接着写一个Interceptor类,并将其定义为切面,使用@Aspect,同时将其交给spring管理,使用@Component注解.代码如下:
@Component
@Aspect
public class LoginInterceptor {
// @PointCut("execution(* bbs.web.action..*.*(..))") 第一个*返回类型 ..当前包及子包
// 第二个*类,第三个*方法,接下的..任意参数
@Pointcut("execution(* bbs.web.action..B*.*(..))")
private void anyMethod() {
}
@Around("anyMethod()")
public String isLogin(ProceedingJoinPoint jp) throws Throwable {
// TODO Auto-generated method stub
User user = (User) ActionContext.getContext().getSession().get("user");
if (user == null)
return "login";
return (String) jp.proceed();
}
}
使用环绕通知(around advice).拦截BoardAction
这一些操作都比较简单了,第一次运行,出现了没有指定方法的错误,仔细分析后,想起了,有一种AOP是使用接口创建代理对象实现的,但我的BoardAction并没有使用接口编程,于是,将BoardAction中抽取一个接口,让BoardAction实现这个接口.测试后成功,会跳到登录窗口.
同时,又想到,还有一种AOP,是通过子类的方法创建代理对象的,它使用cglib的jar包,上网查了一下,只要在<aop:aspectj-autoproxy proxy-target-class="true" />这个配置中使用proxy-target-class="true" 就可以了,测试成功.
总结:spring默认使用接口创建代理对象实现AOP,如果不使用接口编程,可以使用cglib,通过子类实现AOP,做如上配置即可.
使用cglib用到的jar包 在spring 的 lib/cglib下.
但是当登录成功后,运行addboard.jsp,提交内容后,执行BoardAction的add方法时,出现了错误,大致内容是board.name是空.仔细分析后发现,并没有把addboard.jsp post 到 action的一些参数,映射到BoardAction的private Board board;属性.
上网找了很久很久,没有任何结果.有类似错误的贴子,都没有解决方法.
这里简单分析一下:
Struts2,通过拦截器,拦截到对action的请求,并将其参数映射给action 的成员变量
而Spring通过AOP,创建了一个代理类,它是action的子类,这个子类的名称是随机产生的(通过查看出错信息可以看到,每次出错的类并不一样,前缀就是action的类名)
at bbs.web.action.BoardAction$$EnhancerByCGLIB$$24e41fc4.add(<generated>) 这句是错误信息,通过这个类别就可以明白,这是一个由CGLIB产生的类,它是bbs.web.action.BoardAction的子类,出错是在它的add方法。
not-null property references a null or transient value: bbs.domain.bean.Board.name 这句是错误。
当web client提交信息时,实际上执行到的是action的那个代理类,而不是action本身,而struts2并没有向代理类映射相应的参数值.
如何解决呢?研究中。。。。当然,不用AOP,使用struts2的拦截器也一样可以实现权限控制。
相关文章推荐
- SpringAOP实现的用户权限管理【修改了别人的代码,感谢原作者!】
- Spring AOP使用@AspectJ实现日志管理
- 使用拦截器或者AOP实现权限管理(OA系统中实现权限控制)
- springAOP与自定义注解实现细粒度权限控制管理
- 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例。
- 使用spring的aop实现权限拦截后出现依赖注入为空的问题
- spring aop实现用户权限管理的示例
- spring之使用Spring Security实现权限管理
- spring aop实现权限管理
- php使用位与运算符【&】位或运算符【|】实现权限管理
- spring中使用quarts实现任务定制与管理
- SpringMVC(14):使用springmvc+spring+jdbc 优化订单管理系统的示例(多条件查询用户列表功能实现)
- spring AOP自定义注解方式实现日志管理
- 使用navicat 8实现创建数据库和导入数据 管理用户与权限[图文方法]
- Spring 下事务管理-使用AOP @Transactional注解管理
- spring AOP + 自定义注解实现权限控制小例子
- 使用Spring 2.0 新特性实现声明式事务管理-基于XML Schema
- Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架
- 使用Spring配置文件实现事务管理
- AD域环境下利用Supercrypt实现普通用户安装/运行/更新使用管理权限的方法