以下内容为自己的理解,如果有错误的地方,欢迎指正。
Filter配置在web.xml,而Interceptor配置spring-mvc.xml中,如果项目中同时使用了Filter与Interceptor,则会先执行Filter。
1、Filter中不能直接获取spring中的service,简单测试代码如下:
public class TestFilter implements Filter{ TestService testService; @Override public void init(FilterConfig filterConfig) throws ServletException { ApplicationContext applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext()); //获取spring中的service testService = (TestService)applicationContext.getBean("testService"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { } @Override public void destroy() { } }
如果,如果要调用TestService中的方法,需要在Filter初始化时获取。
2、Interceptor中可以直接使用注解获取spring中的bean,简单测试代码如下:
1 public class TestInterceptor implements HandlerInterceptor{ 2 3 @Resource 4 ItemsServiceImpl a; 5 @Override 6 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 7 throws Exception { 8 System.out.println("执行了preHandle方法"); 9 String rt = a.say(); 10 System.out.println(rt+"interceptor"); 11 return true; 12 } 13 14 @Override 15 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, 16 ModelAndView modelAndView) throws Exception { 17 System.out.println("执行了postHandle方法"); 18 } 19 20 @Override 21 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 22 throws Exception { 23 System.out.println("执行了afterCompletion方法"); 24 } 25 26 }
preHandle方法在执行完Filter(如果项目配置了Filter的话)之后,执行Controller方法之前执行,如果返回false,则后面的Controller方法以及postHandle方法都不会执行。
postHandle方法在执行完Controller方法之后,返回ModelAndView之前执行,此时可以修改ModelAndView中的属性。
afterCompletion方法在postHandle之后执行,通常执行一些资源的清理。
=====遇到有需要的在编辑=====
时间: 2024-10-06 00:16:19