过滤器的实现
要实现一个过滤器只需要Filter接口实现其三个方法即可,三个核心方法
init():
该方法在容器启动初始化过滤器时被调用,它在Filter的整个生命周期中只会被调用一次。注意:这个方法如果执行不成功,那么过滤器不会起作用。doFilter():
容器中的每一次请求都会调用该方法。destory():
当容器销毁过滤器实例时调用该方法,一般在方法中销毁或关闭资源,在过滤器Filter的整个生命周期中只会被调用一次。
过滤器的实现:
package mianshiqian;
import javax.servlet.*;
import java.io.IOException;
/**
* @author 雷雨
* @date 2020/12/19 18:29
* 过滤器的实现
*/
public class MyFiler implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
拦截器的实现
编写一个简单的拦截器的处理类,请求的拦截是通过HandlerInterceptor接口来实现。HandlerInterceptor中也有三个要实现的核心方法:
preHabdler():
这个方法将在请求调用之前执行。注意该方法的返回值为false,将被视为当前请求结束,不仅自身的拦截器会失效,后续的拦截器都不发挥作用。
postHandler():
只有在preHandler()方法的返回值是true时才会执行。会在Controller中的方法调用之后,DispatcherServlet返回渲染视图之前被调用。
afterCompletion():
只有在preHandler()方法的返回值是true时才会执行。在整个请求结束之后,DispatcherServlet渲染了对应视图之后执行。
实现一个简单的拦截器:
package mianshiqian;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author 雷雨
* @date 2020/12/19 18:45
*/
@Component
public class MyHandlerInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("请求调用之前执行,注意这里和Filter不同,是可以调用多次的");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("会在Controller调用之后,DispatcherServlet渲染视图之前调用");
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("会在DispatcherServlet渲染视图之后调用");
}
}
过滤器和拦截器有什么不同(重点难点)
1.使用范围不同
过滤器Filter是在javax.servlet.Filter
接口中实现的,这个规范是在servlet
规范中定义的,也就是过滤器Filter的使用要依赖Tomcat等容器,导致其只能在Web容器中使用。
而拦截器(Interceptor)是Spring的一个组件,并由Spring管理,并不依赖Tomcat等容器,还可以使用在Application等程序中。
2.触发时机不同
在Filter接口要实现的三个方法中,可以看到过滤器在容器初始化之后进行初始化,在请求方法Servlet之前执行。
而在过滤器中的三个核心方法是在进入Servlet后、Controller调用之前预处理,Controller调用之后执行,DispatcherServlet渲染视图之后执行。
3.作用范围不同
过滤器几乎可以对所有进入容器的请求起作用,而拦截器只会对Controller中请求或者访问static目录下的资源请求其作用。
总结:
过滤器和拦截器都是AOP思想的体现。都能实现权限检查,日志记录等。
或者说过滤器和拦截器关注的粒度不同,过滤器关注的点是Servlet执行前,而拦截器是Controller执行的前后(渲染视图后)。
过滤器和拦截器都是AOP思想的体现。都能实现权限检查,日志记录等。
或者说过滤器和拦截器关注的粒度不同,过滤器关注的点是Servlet执行前,而拦截器是Controller执行的前后(渲染视图后)。
总的来说,过滤器和拦截器都能实现对于请求的批量处理,但是如果要实现粒度更小的需求就要使用最原生的AOP的思想进行自定义的切入。