概述
關(guān)于在使用Springboot的使用過程中,對于Spring中的aop面向切面編程中的幾個主要使用場景做了一些記錄
1. Springboot 中配置攔截器
攔截器中用到bean注入時焕毫,需要提前加載bean注解(LoginInterceptor為自己編寫的登錄攔截器)
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public LoginInterceptor getLoginInterceptor() {
return new LoginInterceptor();
}
//添加攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
}
@Override
public void addCorsMappings(CorsRegistry registry) {
super.addCorsMappings(registry);
}
Springboot中的攔截器實現(xiàn)HandlerInterceptor树肃,重寫里面的幾個方法:
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String url = httpServletRequest.getRequestURI();
//處理一些路徑的放行
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
2.異常處理器(全局異常處理)
@ControllerAdvice
public class ExceptionHandler {
@org.springframework.web.bind.annotation.ExceptionHandler(value = Exception.class)
@ResponseBody
public Response handle(Exception e) {
if (e instanceof BusinessException) {
return HttpUtil.respondFail(((BusinessException) e).getCode(), e.getMessage());
} else if (e instanceof NullPointerException) {
e.printStackTrace();
return HttpUtil.respondFail(500, "服務(wù)器繁忙");
}
e.printStackTrace();
return HttpUtil.respondFail(500, "服務(wù)器開小差了");
}
}
3.使用aop實現(xiàn)統(tǒng)一日志記錄打印
@Aspect
@Component
public class HttpAspect {
private static Logger logger = LoggerFactory.getLogger(HttpAspect.class);
// 定義切點Pointcut
@Pointcut("execution(* com.*.controller..*.*(..))")
public void logHttp() {
}
@Around("logHttp()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes sra = (ServletRequestAttributes) ra;
HttpServletRequest request = sra.getRequest();
String url = request.getRequestURL().toString();
String method = request.getMethod();
String uri = request.getRequestURI();
String queryString = request.getQueryString();
logger.info("請求開始, 各個參數(shù), url: {}, method: {}, uri: {}, params: {}", url, method, uri, queryString);
// result的值就是被攔截方法的返回值
Object result = pjp.proceed();
Gson gson = new Gson();
logger.info("請求結(jié)束,controller的返回值是 " + gson.toJson(result));
return result;
}
}
Created By 2018 - 04 -12