日期:2014-05-17  浏览次数:20849 次

用AOP拦截Service层时,如果取得当前的User对象?
做业务日志,通过AOP对Service层的一些操作进行拦截,并把相关操作写入数据库的日志表中

但在此日志表中,有个"操作用户"的字段


@Aspect
public class MyInterceptor {


@Before("execution(* com.aa.*.service.impl.*.*(..))")
public void doBefore(){
//...
}


但在这里,怎么才能得到当前的用户这个对象呢?

------解决方案--------------------
在SERVICE里定义USER变量,在INTERCEPTOR里通过ACTIONCONTEXT获得被拦截的ACTION,然后调用USER的GETTER就可以获得了。
如果是用户的话可以直接把UID放在SESSION里
------解决方案--------------------
如果取不到,说明这个方法不直接与用户相关。
所以你记录用户也没有啥意义,所以建议你就空着这个字段就好了
------解决方案--------------------
DOBEFORE你要記錄什麽?
而且誰說攔截不到SESSION和REQUEST?
------解决方案--------------------
先搞清楚你要操作的User是从哪里得出来的,然后再想办法存在某个容器当中,在serivce中直接去调用那个容器,这不就行了吗。
------解决方案--------------------
我以前是这么处理的 


1、在web.xml中增加一个Filter; 
2、在该Filter中将HttpSession置入一个ThreadLocal的对象中; 
3、在拦截器中get这个ThreadLocal对象;


------解决方案--------------------
WebUtils里面应该有方法可以取到  
------解决方案--------------------
struts2中ServletActionContext.getRequest().getSession()
------解决方案--------------------
7楼,的确是个好主意。  但是真实项目中会不会这么用呢?