过滤器(Filter)
1.如果你想把一些第三方的过滤器加入到你项目你可以。
@Bean
public FilterRegistrationBean timeFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
TimeFilter timeFilter = new TimeFilter();
List<String> a = new ArrayList<String>();
//下面表示所有请求都通过 当然你可以选择你想要的
a.add("/*");
registrationBean.setFilter(timeFilter);
registrationBean.setUrlPatterns(a);
return registrationBean;
2:过滤器的一些缺点。
因为过滤器只是获得请求与相应,所以你只能从请求中获得一些参数。你要是想获得哪个控制器哪个方法处理执行的话,你是无法知道的。filter这个接口是j2ee定义的,而controller是springmvc自己定义的一套规范,所以filter是无法得知哪个控制器哪个方法处理执行的。
拦截器(Interceptor)
拦截器这个东西是spring框架本身提供的。特征就是实现了HandlerInterceptor接口。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//controller方法在被调用之前 这个方法被调用
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//controller方法在被调用之后 这个方法被调用,出异常的话则不被调用
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 不论是否有异常这个都调用
}
2实现
public class Config extends WebMvcConfigurerAdapter {
@Autowired
private timeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor);
}
3.缺点
你无法拿到传入参数的值。我们可以查看源码DispatcherServlet下的doService方法中的doDispatch方法。里面applyPreHandle(大约963行-971),这个方法是调用我们写的拦截器,而在(967)ha.handle这里才会将请求转换为请求参数。所以拦截器是无法获得请求参数的。
ps:不仅是自己的写的控制器(controller)会被拦截,spring本身的controller也会被拦截
切片(Aspect)
下面我就来讲讲切片这个类了,对没有错 ,切片是一个类。如果你想实现它,那么你需要有两个步骤。
1:切入点(注解)——在那些方法起作用,什么时候起作用
2:增强(方法)——起作用时执行的逻辑
具体预防官网可查