Spring Boot-Aop和拦截器

Aop操作:

AOP代码:

package com.odSystem.base.Exception.AOP;

import com.odSystem.base.Exception.ExceptionHandle;
import com.odSystem.base.ResponseModel;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;

/**
* @ClassName HttpAspect
* @Author 12575
* @Date 2021/11/1 16:28
* @Version 1.0
**/
@Aspect
@Component
public class HttpAspectAopConfig {
private final static Logger LOGGER = LoggerFactory.getLogger(HttpAspectAopConfig.class);

@Autowired
private ExceptionHandle exceptionHandle;

@Pointcut(“execution(public * com.odSystem.controller.*.*(..))”)
public void log(){

}

@Before(“log()”)
public void doBefore(JoinPoint joinPoint){
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();

//url
LOGGER.info(“url={}”,request.getRequestURL());
//method
LOGGER.info(“method={}”,request.getMethod());
//ip
LOGGER.info(“id={}”,request.getRemoteAddr());
//class_method
LOGGER.info(“class_method={}”,joinPoint.getSignature().getDeclaringTypeName() + “,” + joinPoint.getSignature().getName());
//args[]
LOGGER.info(“args={}”,joinPoint.getArgs());
}

@Around(“log()”)
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
ResponseModel responseModel = null;
try {

} catch (Exception e) {
return exceptionHandle.exceptionGet(e);
}
if(responseModel == null){
return proceedingJoinPoint.proceed();
}else {
return responseModel;
}
}

@AfterReturning(pointcut = “log()”,returning = “object”)//打印输出结果
public void doAfterReturing(Object object){
LOGGER.info(“response={}”,object.toString());
}
}

测试输出:

拦截请求–进入Controller前
2021-11-01 23:13:20.430 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : url=http://localhost:8083/api/odSystemInfo/addSystemInfo/20
2021-11-01 23:13:20.430 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : method=POST
2021-11-01 23:13:20.430 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : id=0:0:0:0:0:0:0:1
2021-11-01 23:13:20.431 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : class_method=com.odSystem.controller.ObsystemController,addSystemInfo
2021-11-01 23:13:20.432 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : args=20
2021-11-01 23:13:20.491 INFO 80548 — [nio-8083-exec-3] c.o.b.Exception.AOP.HttpAspectAopConfig : response=com.odSystem.base.ResponseModel@237c00d0
拦截请求–Controller中方法执行完
拦截请求–视图渲染完成后

拦截器

拦截器

  1. 定义拦截器类:拦截器需要放在容器中

实现HadlerInterceptor接口,重写其中的preHandle postHandle方法

方法中进行拦截和放行的判断,如果放行return true;

拦截器代码:

package com.odSystem.config;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @ClassName InterceptorExceptionConfig
* @Author 12575
* @Date 2021/11/1 15:41
* @Version 1.0
**/
public class InterceptorExceptionConfig implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {


System.out.println("拦截请求--进入Controller前");
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截请求--Controller中方法执行完");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
if (ex != null){
System.out.println("拦截器判断存在异常,但不能处理异常");
}
System.out.println("拦截请求--视图渲染完成后");
}
}
  • Config中配置拦截器容器实现WebMvcConfiguer接口,将拦截器注册到这个容器中

2.添加需要拦截的api,添加需要排除的api

拦截器容器配置

发表评论