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

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

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

Sql代码 复制代码 收藏代码

    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的思想可以进行无侵入式的开发,这符合当前非常强调的松耦合性,对以后的维护来讲也相对会简单一些。

转载于:https://my.oschina.net/huluobotx/blog/499931

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现用户的登录日志记录,可以使用AOP(面向切面编程)技术,在用户登录或退的时候记录日志。 首先,需要在Spring配置文件中开启AOP支持: ``` <aop:aspectj-autoproxy /> ``` 然后,定义一个切面类来处理登录日志记录: ``` @Aspect public class LoginAspect { @Autowired private HttpServletRequest request; @Autowired private UserService userService; @Pointcut("execution(* com.example.controller.*Controller.login(..))") public void login() {} @Pointcut("execution(* com.example.controller.*Controller.logout(..))") public void logout() {} @AfterReturning("login()") public void afterLogin(JoinPoint joinPoint) { String username = (String) joinPoint.getArgs()[0]; User user = userService.getUserByUsername(username); String ip = request.getRemoteAddr(); String message = "User " + username + " logged in from " + ip; Log log = new Log(user.getId(), message); userService.saveLog(log); } @AfterReturning("logout()") public void afterLogout() { User user = (User) request.getSession().getAttribute("user"); String username = user.getUsername(); String ip = request.getRemoteAddr(); String message = "User " + username + " logged out from " + ip; Log log = new Log(user.getId(), message); userService.saveLog(log); } } ``` 在切面类中定义了两个切点,分别对应用户登录和退的方法。在用户登录后,通过参数获取用户名,再通过UserService获取用户信息和IP地址,最后记录日志。在用户退后,从Session中获取用户信息,获取IP地址,记录日志。 最后,在Spring配置文件中配置切面类: ``` <bean class="com.example.aspect.LoginAspect" /> ``` 这样,在用户登录和退的时候,就会自动记录日志了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值