通过切面实现相关业务逻辑

一、xml配置  

<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<bean id="logAspect" class="com.ucfgroup.framework.web.app.aspect.LogAspect" />
<aop:config>
    <!-- 配置切点表达式 -->
    <aop:pointcut id="pointcut" expression="execution(* com.ucfgroup.framework.web.app.*.controller.*.*(..))" />
    <aop:aspect order="1" ref="logAspect">
        <!-- 前置通知 -->
        <aop:before method="logManager" pointcut-ref="pointcut" />
    </aop:aspect>
</aop:config>
View Code

 

二、java代码

package com.ucfgroup.framework.web.app.aspect;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.ucfgroup.framework.utils.WebUtil;
import com.ucfgroup.framework.web.app.personal.entity.PUserZt;
import com.ucfgroup.framework.web.app.usrmgmt.dao.TOperLogMapper;
import com.ucfgroup.framework.web.app.usrmgmt.entity.TOperLog;
import com.ucfgroup.framework.web.app.usrmgmt.entity.TuUser;
import com.ucfgroup.framework.web.log.model.OperLog;

public class LogAspect {
    @Autowired
    private TOperLogMapper tOperLogMapper;
    protected Logger LOG = Logger.getLogger(getClass());

    public void logManager(JoinPoint joinPoint) throws Exception {
        // 记录日志失败不影响业务继续
        try {

            // // 接收到请求,记录请求内容
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            HttpServletRequest request = attributes.getRequest();

            HttpSession session = request.getSession();
            PUserZt zt = (PUserZt) session.getAttribute("ZTModel");
            TuUser tuUser = (TuUser) session.getAttribute("USER_INFO");

            // check if user is login
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();

            // 记录日志失败不影响业务继续

            String method = joinPoint.getSignature().getName();
            TOperLog tOperLog = new TOperLog();
            if (null != tuUser) {
                tOperLog.setUsername(tuUser.getUsername());
            }
            if (null != zt) {
                // log.setBranchNo(zt.getBranchNo());
                tOperLog.setClientId(zt.getZtid());
            }
            tOperLog.setBrowserAgent(request.getHeader("user-agent"));
            tOperLog.setIpAddress(WebUtil.getIpAddr(request));
            tOperLog.setMethod(StringUtils.hasText(method) ? method.replace("do", "").toUpperCase() : "");
            tOperLog.setOperationTime(new Date(System.currentTimeMillis()));
            tOperLog.setReqMsg(getReqMsg(request));
            tOperLog.setResUrl(request.getServletPath());

            if ("GET".equals(tOperLog.getMethod()) || "HEAD".equals(tOperLog.getMethod())
                    || "OPTIONS".equals(tOperLog.getMethod())) {
                tOperLog.setLogType(OperLog.ACCESS_LOG);
            } else {
                tOperLog.setLogType(OperLog.UPDATE_LOG);
            }

            tOperLogMapper.insert(tOperLog);
        } catch (Throwable e) {
            LOG.error("Save log failed: " + e.getMessage(), e);
        }
    }

    private String getReqMsg(HttpServletRequest request) {
        Map<String, String> paraMap = getReqParams(request);
        StringBuilder parameterStr = new StringBuilder();
        boolean first = true;
        for (Entry<String, String> entry : paraMap.entrySet()) {
            if (!first) {
                parameterStr.append("&");
            } else {
                first = false;
            }
            String value = entry.getValue();
            parameterStr.append(entry.getKey()).append("=");

            // 隐藏 password 域
            if (entry.getKey().toLowerCase().contains("password")) {
                parameterStr.append("********");
            } else {
                parameterStr.append(value);
            }
        }
        return parameterStr.toString();
    }

    private Map<String, String> getReqParams(HttpServletRequest request) {
        Map<String, String> reqParams = new HashMap<String, String>();

        // trim the parameters
        Iterator<String> it = request.getParameterMap().keySet().iterator();
        while (it.hasNext()) {
            String key = it.next();
            // 密码不做trim()
            if (key.toLowerCase().contains("password")) {
                reqParams.put(key, request.getParameter(key));
            } else {
                reqParams.put(key, request.getParameter(key).trim());
            }
        }
        return reqParams;
    }
}
View Code

三、总结

Aop的内容非常丰富,由于时间原因,我先将亲测可行的代码记录下来,以后我会慢慢丰富其内容的,毕竟知识越辨越明。

转载于:https://www.cnblogs.com/yanduanduan/p/6524593.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AOP(Aspect-Oriented Programming)是一种编程范式,通过将横切关注点(cross-cutting concern)从主业务逻辑中分离出来,切面(Aspect)实现对主业务逻辑的增强。 AOP中切面的主要作用是实现横切关注点的集中处理,从而减少重复代码的编写。切面可以通过织入(Weaving)的方式,将需要增强的逻辑插入到目标代码中,实现对目标代码的增强效果。 在实现增强的过程中,切面可以通过一些通知(Advice)来定义增强逻辑。常见的通知类型包括前置通知(Before Advice)、后置通知(After Advice)、返回通知(After Returning Advice)、异常通知(After Throwing Advice)以及环绕通知(Around Advice)。通过定义这些通知,我们可以在目标代码的不同阶段执行相应的增强逻辑,以达到特定的目的。 比如,我们可以定义一个前置通知,在目标方法执行之前,执行一些预处理逻辑;也可以定义一个后置通知,在目标方法执行之后,执行一些后处理逻辑;还可以定义一个异常通知,在目标方法抛出异常时,执行相关的异常处理逻辑。 使用AOP实现增强的好处是提高了代码的可重用性和可维护性。横切关注点的集中处理使得代码的修改更加集中和便捷,而不需要对每个需要增强的地方进行修改。同时,AOP也提供了灵活的增强方式,可以根据实际需要选择不同的通知类型,从而实现更加精细化的增强效果。 总之,AOP的切面实现增强能够有效地将横切关注点从主业务逻辑中剥离出来,并通过定义通知的方式实现对主业务逻辑的增强,从而提高代码的可维护性和可重用性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值