过滤器能够过滤请求,但是不能够拿到是哪个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;
}
}