1 過濾器
1.1 使用
定義bean
@Component
public class TimeFilter implements Filter {
//過濾器銷燬的方法
@Override
public void destroy() {
System.out.println("time filter destroy");
}
// 攔截處理方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("time filter start");
long start = new Date().getTime();
chain.doFilter(request, response);
System.out.println("time filter 耗時:"+ (new Date().getTime() - start));
System.out.println("time filter finish");
}
//初始化方法
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("time filter init");
}
}
1.2 特點
- 能夠拿到有原始的請求和響應
- 無法拿到請求的controller方法信息
2 攔截器
2.1 使用
定義bean
@Component
public class TimeInterceptor implements HandlerInterceptor {
/**
* controller方法調用之前該方法被調用
* @param request
* @param response
* @param handler 控制器處理方法的聲明
* @return boolean
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle");
System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
System.out.println(((HandlerMethod)handler).getMethod().getName());
request.setAttribute("startTime", new Date().getTime());
return true;
}
/**
* controller方法被調用之後該方法被調用,
* 如果controller方法拋出了異常且未被處理該方法不會被調用。
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
Long start = (Long) request.getAttribute("startTime");
System.out.println("time interceptor 耗時:"+ (new Date().getTime() - start));
}
/**
* 在postHandle方法之後執行
* controller方法是否拋出異常是否處理,該方法都會被調用
* @param request
* @param response
* @param handler
* @param ex controller方法拋出的異常,當沒有拋出異常時 ex爲null
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion");
Long start = (Long) request.getAttribute("startTime");
System.out.println("time interceptor 耗時:"+ (new Date().getTime() - start));
System.out.println("ex is "+ex);
}
}
註冊攔截器
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@SuppressWarnings("unused")
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
2.2 特點
- 能夠拿到controller方法的信息、請求、響應。
- 無法拿到controller方法的參數
3 切片
切片類包含
- 切點-註解(1 在哪些方法上起作用 2 在什麼時候起作用)
- 增強-方法 (起作用時執行的業務邏輯)
3.1 使用
@Aspect
@Component
public class TimeAspect {
/**
* 起作用時間
* <code>@before<code/>方法調用前起作用
* <code>@after</code>方法執行後,拋出異常爲處理不執行
* <code>@afterThrowing</code>方法執行後,如果拋出異常是否處理都會起作用
* <code>@Around</code>包含上面三種
* 在什麼樣的方法上起作用
* <code>* /任何返回值
* UserController. /UserController類
* *(..) /UserController類下的任何方法
* <code/>
* 其他業務需求請參考spring官網
* @param pjp
* @return
* @throws Throwable
*/
@Around("execution(* UserController.*(..))")
public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("time aspect start");
// 獲取參數
Object[] args = pjp.getArgs();
for (Object arg : args) {
System.out.println("arg is "+arg);
}
long start = new Date().getTime();
Object object = pjp.proceed();
System.out.println("time aspect 耗時:"+ (new Date().getTime() - start));
System.out.println("time aspect end");
return object;
}
}
3.2 特點
- 能拿到方法的參數
- 能到請求處理的對象