`
wuxw920
  • 浏览: 31586 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

基于SSH2框架AspectJ的登录登出日志实现

阅读更多
前段时间帮朋友搞了个小项目,也是在网上参考了别人博客后自己运用AspectJ AOP切面实现登录登出日志的功能。今天拿出来和大家分享下。

AOP切面是一个非常不错的特性,为我们带来了一种新的编程方式,对代码的无侵入性是它最大的特点。平时我们用到的Struts2拦截器就是AOP的一个典型运用。从Spring的低版本开始就能够实现切面功能,但是非常麻烦,不过当Spring升级到2.0之后,这一情况就彻底改变了。运用JDK 5.0支持的注解特性,大大方便了我们的开发。在本篇中,我将以AspectJ注解方式实现AOP的切面功能。
    在这里我还是假设一下,你已经对Spring AOP有一个基本了解,至少知道AOP的基本概念,比如:切入点,通知,切入表达式,横切逻辑等等内容。那么只需要在之前的基础上做下小小的改变,就可以使用AspectJ实现日志的登录登出功能。
    增加日志表
    记录日志信息当然需要日志表了,我们在数据库中增加一个log表。
    Create table 'log'(
     'id' int(11) not null;
     'name' varchar(20) default null;
     'method' varchar(20) default null;
     'time' timestamp default null;
     primary key('id')
    )engine=InnoDB default charset=uft8
    

    增加实体类
    增加Log实体类,字段名与属性名一致,这样就可以不用加Column注解了。另外没有其它的关联关系,这个类很干净,是一个纯POJO类。具体请看源码,这里就不贴出来了。
    增加切面类
    这就是本篇的关键所在了,定义切面类。在common包下面再增加一个aop包,创建LogAspect类.
    /**
     * 使用AspectJ实现登录登出日志AOP
     * @author wuxw920
     */
    @Aspect
    public class LogAspect{

        @Autowired
        @Qualifier("hibernateDao")
        private LogDAO logDao;
        
       @After("execution(* com.wuxw920.ssh.LoginAction.login(..))")
       public void afterLoginLog(JoinPoint joinPoint) throws Throwable{
             User user = (User)ServletActionContext.getRequest().getSesion().getAttribute("user");
             if(user != null){
                  saveLog(user,joinPoint);//保存登入日志
               }
        }

       @Before("execution(* com.wuxw920.ssh.LoginAction.logout(..))")
       public void beforeLogoutLog(JoinPoint joinPoint) throws Throwable{
             User user = (User)ServletActionContext.getRequest().getSesion().getAttribute("user");
             if(user != null){
                  saveLog(user,joinPoint);//保存登出日志
               }
        }

        private void saveLog(User user , JoinPoint joinPoint){
             Log log = new Log();
             log.setName(user.getName());
             log.setMethod(joinPoint.getSignature().getName());//切入方法
               log.setTime(new Timestamp(System.currentTimeMillis()));时间
               logDao.save(log);
        }
   }

    在LogAspect类之上标明@Aspect注解,指定此类为一个切面类。这样的实现方式是不是很简单?然后定义切入点与通知类型以及切入实现(一般叫做横切增强,其实就是切入之后想实现的功能)。这里实现了两个切入方法,一个是登录,当执行完登录操作,还没有转向到结果页面时执行;另一个是登出,在执行登出之前调用横切逻辑。最后一个是共用的保存日志方法,这里只是简单的说明日志记录如何实现,可以对日志表进行扩充,比如增加用户ID、IP地址等信息。
    @Before和@After都是通知类型,前者是在连接点之前执行,后者则是在连接点之后执行。
    修改struts.xml
    增加一行配置
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />
,作用是确保Spring的自动装配策略总是被考虑。默认为false,如果不将它改为true,则在使用CGLib代理Action类后,使用@Autowired注入的service类将会为null,那么这些目标方法中与数据库交互的逻辑都不能执行,所以一定要将它改为true。
    修改applicationContext.xml
   添加
<aop:aspectj-autoproxy proxy-target-class="true" />
声明,为Spring容器中那些匹配@AspectJ切面的Bean创建代理,其中的proxy-target-class="true" 表示使用CGLib动态代理技术织入增强,不过只声明还不行,还得织入,把编写好的切面类完整路径添加到配置文件中,这样才能发挥切面的功能。
    到这里,所有工作都已经完成,启动服务器,来试一下,看看登入登出后,log表中是否会有记录?通过这个实例,我们可以看到,运用AOP的思想可以进行无侵入式的开发,这符合当前非常强调的松耦合性,对以后的维护来讲也相对会简单一些。

ok,到此为止,午饭还没吃呢,去吃饭了。
分享到:
评论
2 楼 wuxw920 2013-04-07  
mengshan007 写道
楼主,上下源码?
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />  <aop:aspectj-autoproxy proxy-target-class="true" />  
  我都加了,还是不行啊,action里的service还是没有被注入,求解!!!

发下源码看看 错误呢
1 楼 mengshan007 2013-01-19  
楼主,上下源码?
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true" />  <aop:aspectj-autoproxy proxy-target-class="true" />  
  我都加了,还是不行啊,action里的service还是没有被注入,求解!!!

相关推荐

    ssh2框架集成包

    另外,AspectJ是一个强大的AOP(面向切面编程)框架,它允许开发者定义和实现横切关注点,比如日志、权限检查等。在SSH集成中,AspectJ可以进一步提升代码的模块化,使业务逻辑更专注于核心功能。 最后,JUnit是...

    ssh2框架的所有jar包

    SSH2框架,全称为Secure Shell 2,是一个用于网络服务的安全协议,主要用于提供加密网络通信、身份验证以及安全数据传输。然而,在这里提到的"ssh2框架的所有jar包"实际上可能指的是Spring、Struts2和Hibernate这三...

    基于DWZ富客户端框架的ssh2的项目lib包

    标题中的“基于DWZ富客户端框架的ssh2的项目lib包”表明这是一个使用DWZ(Dynamic Web Zone)富客户端框架,并结合SSH2(Struts2、Spring、Hibernate2)技术的开发项目。DWZ框架是一种JavaScript和Ajax技术的前端...

    SSH2框架整合总结

    此外,使用Spring的AspectJ支持进行AOP编程,可以更好地实现如日志记录、性能监控等功能。同时,保持业务逻辑和持久化逻辑的分离,让每个组件专注于自己的职责。 7. **性能优化**:SSH2框架本身具有很好的性能,但...

    三大框架SSH架包

    `aspectjweaver-1.7.2.jar`是AspectJ库,可能被Struts2用于实现AOP功能。`freemarker-2.3.19.jar`是FreeMarker模板引擎,用于生成动态HTML页面。 这三大框架结合使用,可以构建出高效、可维护的Java Web应用。...

    SSH框架中的多数据源配置.DOC

    在配置AOP事务管理时,我们使用了Spring框架的AspectJ来实现AOP事务管理。AOP事务管理能够使得应用程序中的事务管理更加灵活和可扩展。 在这个例子中,我们使用了Annotation来定义事务管理的配置信息。这种方式能够...

    Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)

    在Spring框架中,面向切面编程(AOP)是一种强大的设计模式,它允许开发者将关注点从业务逻辑中分离出来,比如日志记录、事务管理等。AspectJ是Java平台上的一个开源AOP框架,提供了丰富的语法来定义切面。本教程将...

    带事务的ssh框架源代码

    在涉及复杂事务的场景下,例如多服务间的事务一致性,SSH框架结合Spring的事务管理能力,可以实现分布式事务。通过设置特定的事务边界和传播属性,确保多个数据库操作要么全部成功,要么全部回滚,保证了数据的一致...

    ssh三大框架所有所需的jar包

    SSH三大框架,即Struts、Hibernate和Spring,是Java Web开发中的重要组成部分,它们为开发者提供了构建高效、可维护的应用程序所需的各种工具和功能。这些框架的整合使用,可以极大地提高开发效率,同时降低了项目的...

    SSH框架整合中用到的jar包

    SSH框架,全称为Struts2、Spring和Hibernate的集成,是Java Web开发中常见的三大开源框架的组合。这个框架组合提供了强大的MVC(Model-View-Controller)设计模式支持,数据库操作,以及依赖注入等功能,大大提高了...

    spring基于AspectJ实现事务控制

    在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...

    在Spring框架中使用AspectJ框架实现AOP的补充jar包.zip

    除了Spring的aop,还有AspectJ框架的aop,这里是在Spring框架中使用AspectJ框架实现AOP的补充jar包,还有一个jar包会随着Spring框架的版本更新而更新。这也是分开成spring框架包和在Spring框架中使用AspectJ框架实现...

    Spring框架(6)AspectJ实现AOP共7页.pd

    本资料“Spring框架(6)AspectJ实现AOP共7页.pdf”将重点介绍基于AspectJ的AOP实现。 首先,AspectJ的引入需要添加相应的库到项目中,包括aspectjrt和aspectjweaver。这两个库分别用于运行时支持和在编译时或类加载...

    基于XML的声明式AspectJ

    AspectJ是一种强大的面向切面编程(AOP)框架,它允许开发者在Java应用程序中分离关注点,如日志、事务管理、性能监控等,从而实现更清晰、更模块化的代码结构。XML的声明式AspectJ是AspectJ的一个重要组成部分,它...

    Spring Aop之AspectJ注解配置实现日志管理的方法

    Spring Aop是基于AspectJ实现的面向切面编程(AOP),它提供了一个灵活的方式来实现日志管理。通过使用AspectJ注解,可以轻松地实现日志记录、性能监控、安全检查等功能。 知识点1: AspectJ注解 AspectJ是Java...

    SSH框架jar包整合

    SSH框架即Struts + Spring + Hibernate的组合,是Java Web开发中的经典MVC架构实现。为了确保项目的顺利进行,需要对涉及到的各种jar包进行整合,以避免版本冲突带来的问题。 #### 二、创建项目与添加相关jar包 ##...

    Spring 使用AspectJ 实现 AOP

    在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...

    SSH框架开发所需全部 43 个包

    SSH框架是Java Web开发中广泛使用的三大开源框架的组合,包括Struts 2、Spring和Hibernate。这个压缩包包含了这三大框架以及C3P0连接池和JSTL标签库的相关包,共计43个文件,是搭建SSH基础环境的理想资源。 首先,...

    SSH2 jar包

    2. **com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar**:这是Spring AOP(面向切面编程)的实现,AspectJ是一个强大的Java编织工具,可以在运行时或编译时对代码进行增强,提供切面功能,如日志记录、事务...

    ssh框架需要的jar包汇总

    3. **aspectjweaver.jar**:AspectJ是一个强大的AOP框架,这个jar包用于Spring框架中的AOP支持,实现切面的编译和运行时织入。 4. **commons-collections-3.1.jar**:Apache Commons Collections库提供了对集合框架...

Global site tag (gtag.js) - Google Analytics