网上都说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你也改一下他的过滤类就可以了。搞了一天,就这点收获,如有不对,希望大家多多指教。只要不骂我就行了。
分享到:
相关推荐
本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...
spring aop做的日志管理,网上看的,没测试过。
spring AOP 切面日志 分层打日志
springaop多数据库读写分离
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
spring aop jar 包
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
swagger和spring Aop日志结合 ,swagger和spring Aop日志结合 ,swagger和spring Aop日志结合 ,
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
SpringAOP的日志拦截示例, 包含配置和代码
该压缩包中包含了一个myeclipse6.5下开发的JAVA基于spring实现的日志记载例子,该例子提供了接受切点参数,解析切点返回值,并且都打印出来了,有详细的文档介绍。
spring aop实现日志功能 开发技术-其它
此工程为使用eclipse创建java project,使用jdk1.8,项目中包含完整的代码和jar包,导入eclipse即可运行
利用自定义注解和spring aop和java反射机制生成用户能够读懂的日志记录。如:用户张三在2013年9月27日17:00执行了用户管理模块的用户删除功能参数为(编号:123456)各位可根据需要写入数据库或者保存到文件。
spring aop的demo spring aop的demo