一、自定义过滤器
- MyFilter.java
package com.filter; import javax.servlet.*; import java.io.IOException; public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("MyFilter---init"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("MyFilter---doFilter"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { System.out.println("MyFilter---destroy"); } }
- web.xml
<filter> <filter-name>myFilter</filter-name> <filter-class>com.filter.MyFilter</filter-class> </filter> <filter-mapping> <filter-name>myFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
二、自定义拦截器
-
MyInterceptor.java
package com.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * com.interceptor * * @author sjh * @version 1.0 */ public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("MyInterceptor ---prehandle"); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("MyInterceptor ---postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor ---afterCompletion"); } }
-
applicationContext.xml
<mvc:interceptors> <bean class="com.interceptor.MyInterceptor"/> </mvc:interceptors>
-
TestController
@Controller public class TestController { @RequestMapping("test") public String test() { System.out.println("test"); return "success"; } }
-
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <% System.out.println("success.jsp");%> success </body> </html>
-
总结
控制台输出顺序如下:MyInterceptor—prehandle
test
MyInterceptor—postHandle
success.jsp
MyInterceptor—afterCompletion根据控制台输出顺序可知拦截器的执行顺序如下
拦截器的preHandle方法----》执行目标方法----》执行拦截器的postHandle方法----》执行页面跳转----》执行拦截器的afterCompletion方法 -
需注意:
(1)如果prehandle方法返回值 为false,那么意味着不放行,那么就会造成后续的所有操作都中断
(2)如果执行到方法中出现异常,那么后续流程不会处理但是afterCompletion方法会执行
三、过滤器和拦截器的关系
-
包含关系
-
执行流程
四、过滤器和拦截器的区别
- 过滤器是基于函数回调的,而拦截器是基于java反射的
- 过滤器依赖于servlet容器,而拦截器不依赖与Servlet容器
- 过滤器几乎对所有的请求都起作用,而拦截器只能对action请求起作用
五、多个过滤器和拦截器的关系
- 运行结果
FirstFilter—doFilter
SecondFilter—doFilter
FirstInterceptor—prehandle
SecondInterceptor—prehandle
test
SecondInterceptor—postHandle
FirstInterceptor—postHandle
success.jsp
SecondInterceptor—afterCompletion
FirstInterceptor—afterCompletion