SpringMVC请求处理流程如下图:
DispatcherServlet和Controller之间那些彩色矩形条,是拦截请求进行额外处理的环节。
SpringMVC中的拦截器是实现了HandlerInterceptor接口的Bean,该接口原型如下:
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;
}
HandlerInterceptorAdapter类是实现了HandlerInterceptor的类,它的三个实现方法都为空,通常我们会继承HandlerInterceptorAdapter来实现自己的拦截器。下面将详细描述如何创建拦截器。
1 新建拦截器类MyInterceptor:
package com.gm.springmvc_test.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class MyInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在controller方法调用前打印信息
System.out.println("This is interceptor.");
// 返回true,将强求继续传递(传递到下一个拦截器,没有其它拦截器了,则传递给Controller)
return true;
}
}
2 配置拦截器到SpringMVC中,新建配置类WebConf:
package com.gm.springmvc_test.conf;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.gm.springmvc_test.controller.MyInterceptor;
@Configuration
public class WebConf extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor());
}
}
通过@Configuration注解申明这个一个配置类。通过InterceptorRegistry.addInterceptor方法来注册一个拦截器,上例中的拦截器将对所有的URL进行拦截,如果想要拦截指定的URL,则可以使用这种方法:
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/index/**");
3 在浏览器中输入localhost:8080,将看到在Eclipse中的Console窗口中输出This is interceptor.