赞
踩
以计算服务处理时间为例,分解介绍三种拦截方式在spring boot环境下的配置,使用,以及优劣比较
public class TimeFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("TimeFilter Init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = new Date().getTime(); System.out.println("TimeFilter start"); filterChain.doFilter(servletRequest, servletResponse); System.out.println("TimeFilter end 总耗时:" + (new Date().getTime() - start)); } @Override public void destroy() { System.out.println("TimeFilter destroy"); } }
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean timeFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
TimeFilter timeFilter = new TimeFilter();
registrationBean.setFilter(timeFilter);
// 自定义拦截路径到urls集合中
List<String> urls = new ArrayList<>();
urls.add("/*");
registrationBean.setUrlPatterns(urls);
return registrationBean;
}
}
public class TimeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("TimeInterceptor preHandle"); // 打印参数对象 System.out.println("TimeInterceptor " + o.getClass().getName()); // 将参数对象转成HandlerMethod对象即可获得拦截对象 System.out.println("TimeInterceptor " + ((HandlerMethod)o).getBean().getClass().getName()); // 获得拦截对象的方法名称 System.out.println("TimeInterceptor " + ((HandlerMethod)o).getMethod().getName()); httpServletRequest.setAttribute("startTime", new Date().getTime()); // 这里决定是否放行 return true; } /** * 正常返回之后进入该方法 */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { long startTime = (long) httpServletRequest.getAttribute("startTime"); System.out.println("TimeInterceptor耗时:" + (new Date().getTime() - startTime)); } /** * 无论是否正常返回都会执行该对象 */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("TimeInterceptor afterCompletion"); System.out.println("TimeInterceptor exception:" + e); } }
只使用@Component注解将Interceptor注入到容器中并不能使拦截器生效。
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
TimeInterceptor interceptor = new TimeInterceptor();
registry.addInterceptor(interceptor);
}
}
@Aspect @Component public class TimeAspect { @Around("execution(* cn.net.zhipeng.web.controller.*.*(..))") public Object timeAspect(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { long start = new Date().getTime(); System.out.println("TimeAspect Start"); for (Object arg : proceedingJoinPoint.getArgs()) { System.out.println("TimeAspect arg: " + arg); } Object proceed = proceedingJoinPoint.proceed(); System.out.println("TimeAspect End 耗时:" + (new Date().getTime() - start)); return proceed; } }
我们同时开启三种拦截,观察我们之前写的打印语句。
TimeFilter start
TimeInterceptor preHandle
TimeInterceptor org.springframework.web.method.HandlerMethod
TimeInterceptor cn.net.zhipeng.web.controller.UserController$$EnhancerBySpringCGLIB$$fad54f7
TimeInterceptor getInfo
TimeAspect Start
TimeAspect arg: 1
TimeAspect End 耗时:6
TimeInterceptor耗时:65
TimeInterceptor afterCompletion
TimeInterceptor exception:null
TimeFilter end 总耗时:86
可以发现执行顺序如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。