ssm框架,利用Spring AOP实现行为日志记录

Spring AOP

代码流程

1、aop配置

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">

	<!-- 扫包 -->
	<context:component-scan base-package="com.eastwit.**"></context:component-scan>
	
	<!-- 开启AOP -->
	<aop:aspectj-autoproxy proxy-target-class="true"/>
	.........................................................................................................

2、自定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
@Component
public @interface AppTraceLog {

    /**
     * 模块
     *
     * @return
     */
    String model() default "";
    /**
     * 行为
     *
     * @return
     */
    AppTrace APP_TRACE() default AppTrace.DEFAULT;
}

3、配置切面类


@Aspect
@Component
public class AppTraceAspect {

    private static final Logger LOGGER = LogManager.getLogger(AppTraceAspect.class);

    @Value("#{properties.XXX}")
    private String XXX;

    @Value("#{properties.YYY}")
    private String YYY;

    @Resource(name = "behaviourForeignServiceImpl")
    private IBehaviourForeignService behaviourForeignService;

    /**
     * 标注该方法体为后置通知,当目标方法执行成功后执行该方法体
     */
    @AfterReturning(pointcut = "within(com.eastwit..*)&&@annotation(rl)" , returning = "res")
    public void addLogSuccess(JoinPoint jp, AppTraceLog rl,Object res) {
        try {
            AppBehavior appBehavior = getParams();
            //日志、功能模块
            appBehavior.setLogtype(rl.APP_TRACE().getCode());
            appBehavior.setModule(rl.model());
            //参数属性字段
            getParamsIn(jp,appBehavior);
            //响应内容、响应内容类型、
            getResponse(res , appBehavior);
            behaviourForeignService.inserAppInfo(appBehavior);
        }catch (Exception e){
            LOGGER.error("dingzhi error,ignore it", e);
        }
    }
     /**
    *响应内容、响应内容类型   不适用集合及复杂类型
     * json
    */
    private void getResponse(Object res, AppBehavior appBehavior) {
        JSONArray jsonArray = new JSONArray();
        try {
            JSONObject jsonObject = new JSONObject((Map)res);
            jsonArray.add(jsonObject);
        }catch (Exception e){
            ResponseData res1 = (ResponseData) res;
            JSONObject jsonObject = new JSONObject((Map)res1.getData());
            jsonArray.add(jsonObject);
            LOGGER.info("getResponse faild :" + e);
        }
        appBehavior.setResponse(String.valueOf(jsonArray));
        appBehavior.setResponsetype("1");
        appBehavior.setResult("成功");
        appBehavior.setErrorcode("");
        appBehavior.setErrorlog("");
        appBehavior.setContent("");
        appBehavior.setCardno(XXX);
        appBehavior.setSource(YYY);
    }


    /**
     * 原始参数、格式化参数
    *  得到请求参数字段名称及字段值
    */
    private void getParamsIn(JoinPoint joinPoint, AppBehavior appBehavior){
        try {
            JSONObject param = new JSONObject();
            //原始参数
            StringBuffer ysParam = new StringBuffer();
            Object[] paramValues = joinPoint.getArgs();
            String[] paramNames = ((CodeSignature)joinPoint.getSignature()).getParameterNames();
            for (int i = 0; i < paramNames.length; i++) {
                if (!(paramValues[i] instanceof HttpServletRequest) && !(paramValues[i] instanceof HttpServletResponse)) {
                    param.put(paramNames[i], paramValues[i]);
                    ysParam.append(paramNames[i] + "=" + paramValues[i]);
                    ysParam.append(",");
                }
            }
            appBehavior.setParams(ysParam.length() == 0 ? "" : ysParam.substring(0, ysParam.length()-1));
            appBehavior.setFormatparam(param.toJSONString());
        }catch (Exception e){
            LOGGER.info("getParamsIn faild :" + e);
        }
    }


    /**
     * 获取客户端地址、端口、session标识
     * 服务器ip:端口 日志记录时间
     * 请求耗时可为空
     * @return
     */
    private AppBehavior getParams() {
        try {
            AppBehavior appBehavior = new AppBehavior();
            //警号
            appBehavior.setPoliceid("");
            //证书
            appBehavior.setSn("");
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            HttpServletRequest request = servletRequestAttributes.getRequest();
            //服务器网络协议
            String networkProtocol = request.getScheme();
            //服务器网络ip
            String localAddr = request.getLocalAddr();
            //服务器网络端口
            int serverPort = request.getServerPort();
            //获取客户端地址、端口、session标识
            HttpSession session = request.getSession();
            appBehavior.setRequestid(getUUID32());
            //session标识
            appBehavior.setSessionid(session.getId());
            //获取客户端ip
            appBehavior.setTerminalip(request.getRemoteAddr());
            appBehavior.setSourceip(request.getRemoteAddr());
            //获取客户端端口
            appBehavior.setSourceport(request.getRemotePort());
            //服务器网络ip
            appBehavior.setDestip(localAddr);
            //服务器网络端口
            appBehavior.setDestport(serverPort);
            //服务器器日志记录时间
            appBehavior.setTime(BigInteger.valueOf(System.currentTimeMillis()));
            //uri
            appBehavior.setUri(request.getRequestURI());
            //url 项目发布名称
            appBehavior.setUrl(networkProtocol + "://" + localAddr + ":" + serverPort + request.getRequestURI());
            return appBehavior;
        } catch (Exception e) {
            LOGGER.info("getParams faild :" + e);
        }
        return null;
    }
 }

4、类方法添加注解

 @AppTraceLog(model = "工单 > 今日告警及工单",APP_TRACE = AppTrace.LOGIN)
    @RequestMapping("/inquireIndexMessage")
    @ResponseBody
    public Object inquireIndexMessage(HttpServletRequest request, HttpServletResponse response) {
    
    }

效果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值