SpringMVC的拦截器类似于Servlet开发中的Filter,用于对处理器进行预处理和后处理的
过滤器是Servlet 规范中的一部分,任何的java web工程都可以使用
拦截器是SpringMVC框架自己的,只能用在SpringMVC框架的工程中。
过滤器在url-pattern中配置了/*之后,可以对所有要访问的资源拦截
拦截器它只会拦截访问的控制器方法,如果访问的是jsp、html、css、image,或则js是不会进行拦截的。
我们自定义拦截器必须要实现HandlerInterceptor接口
1、编写个普通类实现HandlerInterceptor接口,重写preHandle这个方法,如果返回true 代表放行,继续执行Controller里的方法,如果返回的是false,代表不放行,不能继续执行Controller的方法
public class MyInterceptor implements HandlerInterceptor{
@Override
public boolen preHandle(HttpServletRequest request,HttpServletResponse reponse,Object handler)throw Exception{
System.out.println("执行了拦截器方法");
return true;
}
}
2、配置拦截器 ,在web.xml里,前端控制器那个web.xml
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean id="myInterceptor" class="com.jd.web.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
3、编写一个正常的Controller类
@Controller
@RequestMapping("/user")
public class User{
@RequestMapping("/testInterceptor")
public ModelAndView testInterceptor(){
ModelAndView mv = new ModelAndView();
mv.setView("success");
System.out.println("普通方法执行了");
return mv;
}
}
另外配置了拦截器是采用的xml方式,也可以采用注解的方式配置拦截器
@Configuration
public class Interceptor extend WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry){
MyInterceptor myInterceptor = new MyInterceptor();
registry.addInterceptor(myInterceptor).addPathPatterns("/**")
.excludePathPatterns("/login/loginPage").excludePathPatterns("/login/login")
.excludePathPatterns("/login/registerPage").excludePathPatterns("/login/register");
//把注册页面、注册请求、登录页面、登录请求排除掉
super.addInterceptors(registry);
}
}
下面分析HandlerInterceptor接口里的三方法的含义
public class HandlerInterceptorDemo2 implements HandlerInterceptor{
@Override //先拦截 ,后执行Controller
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
System.out.println("拦截器:preHandle拦截器拦截了");
return false;
}
@Override //先执行Controller后拦截
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器:postHandle方法执行了");
}
@Override //最终执行了
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception {
System.out.println("拦截器:afterCompletion方法执行了");
}
}