文档章节

【SSM】整合AOP,日志框架和拦截器

o
 osc_y8yehimr
发布于 2019/03/20 11:26
字数 679
阅读 11
收藏 0

前言

      日志是所有系统必不可少的部分,而AOP在MVC通常用于监控方法调用,可以生成一个traceid,记录从用户调用到底层数据库的数据链路,帮助监控和排查问题。

AOP

    现在做一个简单的前置切面,用来记录方法和入参,需要修改如下文件

   

 

public class ControllerAspect {

    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

    public void before(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        System.out.println("方法名:"+methodSignature.getMethod().getName()+" 参数列表:"+ArrayToParameterString(methodSignature.getParameterNames(),joinPoint.getArgs()));
    }
    private  String ArrayToParameterString(String[] parameterNames,Object[] parameterValues) {
        StringBuffer sb = new StringBuffer();
        if (parameterNames != null && parameterNames.length > 0) {
            for (int i = 0; i < parameterNames.length; i++) {
                sb.append(parameterNames[i]);
                sb.append(":");
                sb.append(parameterValues[i]);
                sb.append(";");
            }
        }
        return sb.toString();
    }
}
ControllerAspect.java

两个pom.xml需要加入依赖,如

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.1.5.RELEASE</version>
   </dependency>

applicationContext.xml需要加入以下配置

<bean id="controllerAspect" class="cn.com.test.springmvc.common.aop.ControllerAspect">
    </bean>

    <aop:config>
        <aop:aspect ref="controllerAspect">
            <aop:pointcut id="controlPointcut" expression="execution(* cn.com.test.springmvc.web.*.*(..))"></aop:pointcut>
            <aop:before method="before" pointcut-ref="controlPointcut"></aop:before>
        </aop:aspect>
    </aop:config>

dispatcher-servlet.xml需要加入以下配置

<aop:aspectj-autoproxy proxy-target-class="true"/>

运行后可以看到控制台有输出,如下

方法名:getDeptList 参数列表:name:null;

日志

     日志框架加入和使用也比较简单,需要修改如下文件

public class ControllerAspect {

    private final static org.slf4j.Logger logger = LoggerFactory.getLogger(ControllerAspect.class);

    public void before(JoinPoint joinPoint) {
        MethodSignature methodSignature = (MethodSignature)joinPoint.getSignature();
        logger.info("方法名:"+methodSignature.getMethod().getName()+" 参数列表:"+ArrayToParameterString(methodSignature.getParameterNames(),joinPoint.getArgs()));
    }
    private  String ArrayToParameterString(String[] parameterNames,Object[] parameterValues) {
        StringBuffer sb = new StringBuffer();
        if (parameterNames != null && parameterNames.length > 0) {
            for (int i = 0; i < parameterNames.length; i++) {
                sb.append(parameterNames[i]);
                sb.append(":");
                sb.append(parameterValues[i]);
                sb.append(";");
            }
        }
        return sb.toString();
    }
}
ControllerAspect.java

需要加入依赖,如

<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.8.0-alpha2</version>
  </dependency>

还有日志配置,配置日志级别,输出目录等

log4j.rootLogger=INFO,FILE,stdout
#file
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
log4j.appender.FILE.File=./logs/out.log
log4j.appender.FILE.Append=true
log4j.appender.FILE.Threshold=DEBUG
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ] %p:%m%n


log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n

运行后,可以在控制台看到日志输出和在Tomcat的目录bin下面看到日志文件。

拦截器

     拦截器其实也是aop思想中的一种实现,可以看成是特定于controller层的aop,根据对request和Reponse做更细化的处理,加入拦截器需要修改以下文件

public class ControllerInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("链接是"+request.getRequestURL().toString());
        return true;
    }
}
ControllerInterceptor.java

pom.xml加入依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

dispatcher-servlet.xml需要加入以下配置

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.com.test.springmvc.common.interceptor.ControllerInterceptor"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

运行后可以看到

链接是http://localhost:8080/dept/getList

小结

      本文只是简单演示了aop和日志和拦截器的功能,这只是冰山一角,AOP的功能不止这样的。

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

在云函数 SCF 里为 Next.js 跑 SSR

很多时候我们都希望首屏速度快,SEO 友好,那么相比于客户端渲染,SSR 渲染将是这方面的优势。Next.js、Nuxt.js 都是 SSR 框架。本篇文章将介绍 Next.js。 通常我们在部署 SSR 的时候,会担心...

腾讯云Serverless
42分钟前
19
0
一文带你初窥软件测试行业

三大原始问题一——软件测试是什么? 在一定条件下对软件系统进行审核、运行、评估,检验软件系统是否满足规定需求或者找出预期结果与实际结果之间的差别。为软件产品的质量和评价提供依据。...

a伟正是在下
50分钟前
17
0
如何避免APK文件的反向工程? - How to avoid reverse engineering of an APK file?

问题: I am developing a payment processing app for Android, and I want to prevent a hacker from accessing any resources, assets or source code from the APK file. 我正在开发适用......

富含淀粉
52分钟前
13
0
python 抓取 微信公众号文章

1、下载 Fiddler 安装 具体操作传送门 2、第一步已完成,入门开始吧 首先确保有微信客户端(推荐PC,移动端会多一些操作) 启动微信、Fiddler ,然后找到需要抓取的公众号(还是关注一下吧,...

acclea
今天
9
0
JS深拷贝

let arr1 = [1, 2, 3, 4, { name: 'hh'}]/浅克隆****/// 1,展开运算符let arr2 = [...arr1]// 2.splicelet arr3 = arr1.splice(0)/深克隆****/// 1.基...

何祯粮
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部