SpringBoot的攔截器只能攔截流經DispatcherServlet的請求,對於自定義的Servlet無法進行攔截。
SpringMVC中的攔截器有兩種:HandlerInterceptor和WebMvcInterceptor。這兩個接口都定義了請求之前、請求之中、請求之后三個函數,以HandlerInterceptor為例進行說明:
- public boolean preHandle(HttpServletRequest req, HttpServletResponse httpServletResponse, Object o)
- public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)
- public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e)
HandlerInterceptor的函數返回值都是boolean,一旦返回false,就不再處理這個請求,所以它真正具有攔截功能。而WebMvcInterceptor作用只是進行初始化,它的三個函數都是void類型的。
要想使用HandlerInterceptor需要如下幾個步驟:
實現HandlerInterceptor接口
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse httpServletResponse, Object o) throws Exception {
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
添加Configureation
過去可以用xml配置,現在更傾向於用java代碼配置
@Configuration
public class MyWebMvcConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}