package org.springframework.web.servlet;
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
}
preHandle:预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器;返回值:
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。
或者继承HandlerInterceptorAdapter类:HandlerInterceptorAdapter类实现了AsyncHandlerInterceptor接口,同时间又继承了HandlerInterceptor接口。
Spring MVC并没有总的拦截器,不能对所有的请求进行前后拦截。
Spring MVC的拦截器,是属于HandlerMapping级别的,可以有多个HandlerMapping ,每个HandlerMapping可以有自己的拦截器。
当一个请求按Order值从小到大,顺序执行HandlerMapping接口的实现类时,哪一个先有返回,那就可以结束了,后面的HandlerMapping就不走了,本道工序就完成了。就转到下一道工序了。
拦截器会在什么时候执行呢?一个请求交给一个HandlerMapping时,这个HandlerMapping先找有没有处理器来处理这个请求,如何找到了,就执行拦截器,执行完拦截后,交给目标处理器。
如果没有找到处理器,那么这个拦截器就不会被执行。
静态资源:
方案一:拦截所有url
Spring没有总的拦截器,
方案二: 拦截匹配的URL
比方案一多了一个URL匹配。如果是REST风格的URL,静态资源也会被拦截。
方案三:HandlerMappint上的拦截器
如果是REST风格的URL,静态资源就不会被拦截,因为我们精准的注入了拦截器。
如果使用了
其实个人不建议使用
REST风格的四种请求方式:
1、GET:获 取资源
2、POST:新建资源
3、PUT:更新资源
4、DELETE:删除资源
方案一、拦截器中增加针对静态资源不进行过滤
方案二、使用默认的静态资源处理Servlet处理静态资源
在spring-mvc.xml中启用默认Servlet
在web.xml中增加对静态资源的处理
default
*.js
*.css
/static/*"
但是当前的设置必须在Spring的Dispatcher的前面。
方案三、修改Spring的全局拦截设置为*.do的拦截(涉及web.xml)
SpringMVC
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
true
SpringMVC
*.do
这样设置,Spring就会只针对以'.do'结尾的请求进行处理,不再维护静态资源
综上所述,推荐使用第二和第三中方案。