RESTful API的拦截:过滤器Filter、拦截器Interceptor、切片Aspect

mac2022-06-30  79

过滤器能够过滤请求,但是不能够拿到是那个controller的那个方法

拦截器能拿到controller的那个方法,但是不能拿到方法的请求参数值

切片能够拿到详细的请求参数值

 

三者执行顺序

Filter -> Interceptor -> Aspect ->Controller

 

一、过滤器Filter(不知道是那个控制器以及那个方法来处理的)

需求:通过过滤器计算服务请求时间

新建TimeFilter.java,实现Filter

@Component//加上次注解,自动被spring注入 public class TimeFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("拦截初始化,在项目启动的时候执行"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { long start = System.currentTimeMillis(); filterChain.doFilter(servletRequest,servletResponse); long end = System.currentTimeMillis(); System.out.println("花费时间:"+(end-start)+"毫秒"); } @Override public void destroy() { } }

如果不适用@component注解,也可以使用@configuration注解实现过滤器的注入

@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Bean public FilterRegistrationBean getBean(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); TimeFilter timeFilter = new TimeFilter(); registrationBean.setFilter(timeFilter); List<String> urls = new ArrayList<>(); urls.add("/hello"); registrationBean.setUrlPatterns(urls); return registrationBean; } }

二、拦截器的使用

新建TimeInterceptor.java实现 HandlerInterceptor

@Component public class TimeInterceptor implements HandlerInterceptor{ private Logger logger = LoggerFactory.getLogger(TimeInterceptor.class); @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle");long start = new Date().getTime(); httpServletRequest.getSession().setAttribute("start",start); return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle");long start = (long)httpServletRequest.getSession().getAttribute("start"); System.out.println("花费时间:"+(new Date().getTime() - start)); String name = ((HandlerMethod) o).getBean().getClass().getName(); String method = ((HandlerMethod) o).getMethod().getName(); MethodParameter[] methodParameters = ((HandlerMethod) o).getMethodParameters(); logger.info("访问的是"+name + "方法:"+method+"参数"+methodParameters.toString()); } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion"); }

第二步:把服务注册到mvc

@Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Autowired public TimeInterceptor timeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(timeInterceptor).addPathPatterns("/user/*"); } }

三、切片Aspect,通过注解来标注过滤方法

新建TimeAspect.java

@Aspect @Component public class TimeAspect { @Around("execution(* com.imooc.web.controller.UserController.*(..))") //返回类型 方法 (..)参数 public Object doAroundMethod(ProceedingJoinPoint pjd) throws Throwable { System.out.println("========1====="); Object[] args = pjd.getArgs(); for (int i = 0; i < args.length; i++) { System.out.println(args[i].toString()); } Object result = pjd.proceed(); System.out.println("========2====="); return result; } }

 

最新回复(0)