这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
前言
这次给大家讲一下面经常问的内容,已经快要过年了,又是一批新的大学生加入到it的行业当中,只有基础打扎实才可以拿到更好的offer。
废话不多说开始进入正题,今天要讲一下拦截器与过滤器的区别,他们很像,同时又不像。
初识
拦截器与过滤器是在web开发中广泛应用的两个东西,拦截器经常用于对代码增强,又或者是做权限认证,登录认证。而过滤器经常用于对外部的一些请求、返回的参数作出一些自己的业务场景处理。
过滤器
过滤器他是java包下的servlet部分的内容,对所有的请求进行过滤,正如其名字描述一样,可以再参数进入之前作出对应的业务逻辑。创建过滤器需要实现过滤器的接口,也就是Filter接口。
public class Test implements Filter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
System.out.println("过滤前");
// 过滤中执行方法
filterChain.doFilter(request, response);
System.out.println("过滤后");
}
}
这里注意下doFilter这个方法,这个方法是执行对应请求的方法,前后做的逻辑就是过滤器的内容。但是要注意一点是doFilter后先执行的一定是Interceptor拦截器,大家可以看一下上面的图就明白了。
过滤器会对所有请求进行过滤,哪怕你没有请求接口。
拦截器
拦截器是基于java的反射实现的,与过滤器不同的时过滤器采用函数回调。拦截器属于应用层的实现,而filter属于servlet容器的,离开servlet Filter就不可以使用了。一般情况下过滤器能做的拦截器也能做。拦截器经常用户权限检查与性能监控的业务。
拦截器需要注册到拦截器容器中,通过WebMvcConfigurer
把被注册到拦截器容器中的类,实现HandlerInterceptor 接口然后重写以下三个方法即可。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
{
// 拦截点执行前需要做的逻辑
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
{
// 拦截点执行中 需要做的逻辑
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception
{
// 拦截点执行后 准备返还数据需要做的逻辑
}