`

Spring AOP 写日志,取request、session、application

阅读更多
网上都说spring多好多好,哎,没办法,人家说的这么好,我就试着体会一下。先用AOP来写个日志,目标就是把所有前后台针对数据库操作的方法都记录下来,是谁操作,操作了那些类,操作的方法是什么,还有IP地址,
我的环境 spring+webwork+hibernate+oracle,你要是不知道什么是AOP还有webwork,那你自己看去。这里不作解释。最重要的一部就是在:MethodBeforeAdvice这个类的befor里面得到request或session或application,下面说一下我的思路:
1:我看了网上说的最多的就是ThreadLocal 或者是 acegi,后面我的大体的看了下,主要是用来权限控制的,要达到我的的目标我没有找到怎么实现的方法,
我现在就只说ThreadLocal,这个类很不错的,网上很多说法,我的理解就是保证每个线程都有一个独立的变量,我理解了以后就写了下面一个类:
package com.bjfy.util;
import java.io.Serializable;

import javax.servlet.http.HttpServletRequest;


public class BJFYThreadBean implements Serializable{
private static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();

public HttpServletRequest getContext(){
return (HttpServletRequest)threadLocal.get();
}
public void setContext(HttpServletRequest request){
threadLocal.set(request);
}

public void cleanContext(){
threadLocal.set(null);
}
}

我一下开始是在用户登 陆的时候给ThreadLocal附值的,但是在befor方法里面就有问题了,我用 System.out.println(new BJFYThreadBean().getContext()) [说明一下,我的BJFYThreadBean一开始存付的是Users,我的登陆用户信息类]的时候就出怪问题了:
有的为null,有的不为null,我下子就搞晕了,奶奶的,要不就是全为null,就不就是都不为null,后来我查了资料,明白是怎么回事了,这是服务器的问题:因为客户端发送的请求服务器是在进程池里面找一个空闲进程来在客户端的响应,
在登陆以后的页面再请求服务器的时候服务器分给的线程和原来登陆的线程不是同一个线程了,所以ThreadLocal里面的值就得不到了,我看到不为null的时候那是运气,是服务器给你处理的线程正好是你登陆时候用的线程,所以就不为null.
我一下想明白这里就好办了,现在要解决的就是怎么在进到befor方法的这个线程里面附上ThreadLocal呢?想了办天,我把webwork的FilterDispatcher进行了继承,下面是我的继承类:
package com.bjfy.filter;

import java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import com.bjfy.bean.Users;
import com.bjfy.util.BJFYThreadBean;
import com.opensymphony.webwork.dispatcher.FilterDispatcher;

public class WebWorkFilterDispatcher extends FilterDispatcher {
private BJFYThreadBean bJFYThreadBean;
public WebWorkFilterDispatcher(){
bJFYThreadBean =new BJFYThreadBean();
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
super.doFilter(arg0, arg1, arg2);
bJFYThreadBean.setContext((HttpServletRequest)arg0);
}

}

这样就可以保证befor里面得到当前的request了,不过你不要忘了把web.xml里面的配置改一下啊:
    <filter>
        <filter-name>webwork</filter-name>
        <filter-class>com.bjfy.filter.WebWorkFilterDispatcher</filter-class>
        <!-- <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> -->
    </filter>
我用的webwork,我想信框架这种鸟东西都是一样,struts你也改一下他的过滤类就可以了。搞了一天,就这点收获,如有不对,希望大家多多指教。只要不骂我就行了。
分享到:
评论
1 楼 皓月之光 2011-04-29  

相关推荐

Global site tag (gtag.js) - Google Analytics