1. 程式人生 > >使用切片攔截REST服務 Filter Interceptor Aspect

使用切片攔截REST服務 Filter Interceptor Aspect

攔截的方法

  1. 過濾器 Filter 初始化 銷燬 doFilter處理邏輯
  2. 攔截器 Interceptor 呼叫之前 控制器 呼叫之後 最終呼叫
  3. 切片 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);
	}