拦截器: 从字面意思来讲,他的功能就是进行拦截操作,Spring MVC
中拦截器主要是通过 HandlerInterceptor
来实现的,主要功能是拦截用户的 URL
请求并进行相应的处理,比如说用来判断用户是否登录了,进行权限验证等。
实现拦截器的方式
- 实现
HandlerInterceptor
接口 - 实现
WebRequestInterceptor
接口
实现 HandlerInterceptor
接口
public class Interceptor implements HandlerInterceptor {
/*
该方法将在请求处理之前进行调用
在这个方法可以进行一些预处理,比如判断当前请求是否需要继续执行下去,当返回false时,将不会向下执行。在 返回值是true的情况下,如果有多个Interceptor,将会继续执行下一个preHandle()方法,若没有多个 Interceptor,将会执行请求相对应的Controller方法
*/
@Override
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
/*
执行的前提:preHandle()方法返回值为true
该方法在Controller方法执行后,但在DispatcherServlet (前端控制器)进行视图返回渲染之前执行(由 ViewResolver视图解析器进行解析并渲染工作),我们可以在这个方法中对返回的ModelAndView对象进行后续处理
*/
@Override
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
/*
执行的前提:preHandle()方法返回值为true
该方法在进行视图渲染工作完成后执行,即整个请求结束后执行,主要进行收尾工作。
*/
@Override
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
实现 WebRequestInterceptor
接口
三个方法的作用和执行顺序可参考上面 HandlerInterceptor
的解释
public class Interceptor implements WebRequestInterceptor {
public void preHandle(WebRequest request) throws Exception {
}
public void postHandle(WebRequest request, ModelMap model) throws Exception {
}
public void afterCompletion(WebRequest request, Exception ex) throws Exception {
}
}
过滤器: 从字面意思来讲,它就是对请求进行一个过滤,它不能产生请求,也不能进行响应。但可以用来转换HTTP请求、响应和头信息。它可以修改对某一资源的请求,或者修改某一资源的响应。
创建一个Filter的步骤
-
创建Filter 处理类:
-
在
web.xml
文件中配置Filter 。
// 用于完成Filter的初始化。
void init(FilterConfig config):
// 用于Filter 销毁前,完成某些资源的回收。
void destroy():
// 实现过滤功能,该方法就是对每个请求及响应增加的额外处理。
void doFilter(ServletRequest request, ServletResponse response,FilterChain chain):
拦截器与过滤器的区别
- 拦截器是基于Java的反射机制的,而过滤器是基于函数回调
- 过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
- 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
- 拦截器可以访问action上下文、值栈里的对象,而过滤器不能
- 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
监听器: 它是实现了javax.servlet.ServletContextListener
接口的服务器端程序,随着Web容器的启动而启动,只加载一次,主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、就是spring容器启动的时候加载一些数据。
在javax.servlet.ServletContextListener
接口中定义了2种方法:
void contextInitialized(ServletContextEvent sce) 监听器的初始化
void contextDestroyed(ServletContextEvent sce) 监听器销毁
/*
* 当容器启动完成之后
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}