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

Spring AOP , aspect使用时的思路
我们公司的一个项目,已经快完工了, 在dao层里做了记录日志,把每次对数据库的操作的 sql 语句都记录下来了

但现在想把用户的 ip 也给添加到日志里面去

原本是打算,在 controller 里,把 request 对象一层一层往下传递,传到 dao 层,然后取出通过request取出客户端ip,在把ip记录下来,可是这样太过于麻烦了,几乎要改所有的 service层和dao层(添加request这个参数)

我现在想,利用 aspect 的@befor, 每次调用 controller 里的方法时,都把 request 这个对象给截取出来,然后取出 ip ,把ip 存放在某个地方, 等到执行到 dao 层中的时候, 在把刚存起来的 ip 给取出来. 这样的话,不用修改太多代码.


现在问题是, @Befor 已经截取到 request了,并且取到了ip,问题是该把这个ip存放在哪呢?以什么样的形式存呢?在在dao层里,又怎样找到这个存起来的ip呢?


望高人指点思路!!!! 万分感激.如果觉得我表述不是很清楚,说一声,我贴一些源码上来

------解决方案--------------------
用个单例嘛,这个单例里放的是一个list集合
------解决方案--------------------
加一个abstract controller, 获取id,
其他的extends这个abstract controller就可以了。
------解决方案--------------------
多线程中需要保持自身状态的,用ThreadLocal

看下API吧
------解决方案--------------------
比较难实现,多线程情况下很难办到,因为你前面跟后面是完全脱节的,如果你用单例的话,会担心别的线程修改值。 或许你可以考虑关联记录。aop记录ip相关的东西,dao记录sql信息。在aop记录ip的时候关联上sql,这样可能会比较容易实现