使用切片攔截REST服務 Filter Interceptor Aspect
阿新 • • 發佈:2018-12-11
攔截的方法
- 過濾器 Filter 初始化 銷燬 doFilter處理邏輯
- 攔截器 Interceptor 呼叫之前 控制器 呼叫之後 最終呼叫
- 切片 Aspect
過濾器
@Component public class TimeFilter implements Filter { @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); //放行到下一個過濾器,過濾器執行完,去執行action流程 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"); //程式啟動,執行初始化 } @Override public void destroy() { System.out.println("time filter destroy"); } }
不用Component 配置 bean
@Configuration //期初 不用繼承 ,繼承了可以新增攔截器 public class WebConfig extends WebMvcConfigurerAdapter { @SuppressWarnings("unused") @Autowired private TimeInterceptor timeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { // registry.addInterceptor(timeInterceptor); } // @Bean public FilterRegistrationBean timeFilter() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TimeFilter timeFilter = new TimeFilter(); registrationBean.setFilter(timeFilter); List<String> urls = new ArrayList<>(); urls.add("/*"); //自定義URL registrationBean.setUrlPatterns(urls); return registrationBean; } }
缺點:是有哪個Action來處理的,filter是不知道的。filter是j2EE,resultController註解是mvc的 解決用 Interceptor(Spring框架提供的)
Interceptor
@Component //需要繼承 HandlerInterceptor public class TimeInterceptor implements HandlerInterceptor { @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; } @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)); } @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); } }
之後還需要新增到interceptor中 才能用
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@SuppressWarnings("unused")
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// registry.addInterceptor(timeInterceptor);
}