日期:2014-05-19  浏览次数:20732 次

在spring中使用aop进行权限管理, 拦截struts中的action和service哪个更好?
在spring中使用aop进行权限管理, 拦截struts中的action和service哪个更好?
系统中需要对不同的管理员进行权限管理:
数据库设计如下:
=================================================================
t_module(模块表)
id number primary key, -- 模块编号
name varchar2(32), -- 模块名称
user_flag char -- 使用者标记:0――管理员;1――用户;
=================================================================
t_adm(管理员表,管理员分为不同级别,有不同的管理权限,访问不同的模块)
  id number primary key, -- 管理员编码
  login_name varchar2(10) unique not null, -- 登录名
  login_password varchar2(32), -- 登录密码
=================================================================
t_rights(权限表)
 adm_id number references t_adm(id), -- 管理员编码
 module_id number references t_module(id), -- 模块编号
 primary key(adm_id, module_id)
=================================================================
用户表(略)
==========
我想使用spring的拦截器(MethodBeforeAdvice)来对action进行拦截
public void before(Method method, Object[] args, Object target){}
通过method对象获取request参数,然后取出session中存放的用户信息(id)与当前action的名称(转换成对应的模块id)
在数据库中验证权限,但是在配置拦截器的时候发现interceptorNames需要被拦截类的接口
而我拦截的是MappingDispatchAction,所以不行.
而如果拦截的是service的话又不能获取session中的用户信息(id)
不知道该怎么写.
哪位高手指点一下,谢了.(最好有示例代码)

------解决方案--------------------
<bean id="authorityInterceptor" class="com.ce.myTest.web.AuthorityInterceptor"/> 
  
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<list>
<value>/myTestAction</value>
</list>
</property>
<property name="interceptorNames">
<list>
<value>authorityInterceptor</value>
</list>
</property>
</bean> 
用这个可以不指定接口, 给分闪人
------解决方案--------------------
在用户成功过登陆后,首先new 一个 全局的静态的ThreadLocal(),在filter里面 从session里取到用户信息
,直接仍到ThreadLocal里面,这样,无论在那里拦截都能 直接从 ThreadLocal里面拿到用户登陆信息,
但是别忘了,在filter的 注销方法里面将 ThreadLocal清空下,免的得到以前用户返回 ThreadLocal 的 信息。