`

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  

相关推荐

    spring aop 操作日志

    本资源用来展示如何使用 spring aop 进行日志记录,例子里面通过aop的配置,把产生的日志存放到当前项目的根目录下,而且对方法执行过程中的参数进行了记录,对于aop如何记录日志不清楚的同学可以看看。

    Spring AOP 日志管理 实例

    Spring AOP 日志管理 实例LoggingThrowsAdvice.java

    spring aop 自定义注解保存操作日志到mysql数据库 源码

    4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑实现 (需要知道原理的请看spring aop源码,此处不做赘述) 3、...

    spring aop jar 包

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的重要组成部分,它提供了一种在不修改源代码的情况下,对程序进行功能增强的技术。这个"spring aop jar 包"包含了实现这一功能所需的类和接口,...

    JAVA 中Spring aop 实现日志记载

    在Java开发中,Spring AOP(面向切面编程)是一个强大的功能,用于实现日志记录。AOP允许我们在不修改原有代码的情况下,插入新的行为,比如日志记录,事务管理等。下面将详细介绍如何在Spring框架中使用AOP来实现...

    springaop多数据库读写分离

    Spring AOP是Spring框架的重要组成部分,它提供了一种声明式的方式来处理横切关注点,如日志记录、事务管理等。在我们的场景中,Spring AOP可以用于动态地决定哪些操作应该路由到读库,哪些操作应该路由到写库。 要...

    spring aop实现日志功能

    Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一部分,它提供了一种优雅的方式来处理横切关注点,如日志、事务管理、性能监控等。这些关注点通常会分散在应用程序的各个角落,而AOP则允许...

    spring aop 切面添加日志

    本项目旨在演示如何在Spring AOP中添加日志功能,以实现对应用程序执行过程的透明跟踪。通过使用Java 1.8,我们可以利用其新特性,如Lambda表达式,来简化代码。 首先,让我们理解Spring AOP的基本概念。AOP是面向...

    Spring AOP 16道面试题及答案.docx

    总的来说,Spring AOP通过代理和通知机制,实现了横切关注点的模块化,使得业务逻辑与系统服务(如日志、事务等)解耦,提高了代码的可读性和可维护性。同时,引介功能进一步增强了切面的功能,可以为对象动态地添加...

    简单spring aop 例子

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点问题,如日志、事务管理、安全性等。本示例将简要介绍如何在Spring应用中实现AOP,通过实际的...

    spring AOP 切面日志 分层打日志

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改源代码的情况下,对程序进行横向关注点的插入,比如日志记录、事务管理、权限检查等。在这里,我们重点关注如何利用Spring AOP实现分层...

    Spring AOP完整例子

    总结一下,Spring AOP提供了一种优雅的方式来处理系统的横切关注点,如日志记录、事务管理或性能监控。通过定义切点、创建切面和配置通知,我们可以实现代码的解耦,提高可维护性和复用性。这个例子提供了学习Spring...

    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-...

    SpringAOP的日志管理

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,比如日志、事务管理、性能监控等。在本项目中,我们将深入探讨如何利用Spring AOP进行日志管理...

    spring aop切面拦截指定类和方法实现流程日志跟踪

    ### Spring AOP 实现流程日志跟踪 #### 一、背景与目的 在现代软件开发过程中,为了确保系统的稳定性和可维护性,通常会引入非功能性的需求来增强应用程序的功能,比如日志记录、安全控制等。这些需求往往不是业务...

    spring aop依赖jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为Java应用程序提供了声明式的企业级服务,如事务管理、性能监控等。在Spring AOP中,我们可以通过定义切面(Aspect...

    Spring Aop四个依赖的Jar包

    Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的一个重要模块,它通过提供声明式的方式来实现面向切面编程,从而简化了应用程序的开发和维护。在Spring AOP中,我们无需深入到每个...

    Spring AOP面向方面编程原理:AOP概念

    ### Spring AOP面向方面编程原理:AOP概念详解 #### 一、引言 随着软件系统的日益复杂,传统的面向对象编程(OOP)逐渐暴露出难以应对某些横切关注点(cross-cutting concerns)的问题。为了解决这一挑战,面向方面编程...

    SpringAOP日志管理

    采用SpringAOP拦截Controller,Service实现操作日志管理,统一处理异常,登陆日志管理,是SpringAOP的应用实践。通过SpringAOP的处理,可以方便移植日志管理功能,是个不错的学习demo

Global site tag (gtag.js) - Google Analytics