SpringMVC过滤器、拦截器、异常处理器

1、过滤器

我们可以使用过滤器将所有的请求拦截下来并进行一个统一的处理

使用步骤:
// 1.创建一个过滤器类
// 2.实现Filter接口
// 3.重写接口中的抽象方法实现公共的逻辑处理
// 4.在web.xml中配置过滤器【让过滤器生效】
public class FilterConfig implements Filter {
private String encoding;
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      // 处理逻辑  
    }
}
<!-- 在web.xml中配置过滤器【让过滤器生效】-->
<filter>
	<filter-name>FilterConfig</filter-name>
	<filterclass>com.qfstudy.demo.FilterConfig</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>utf-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>FilterConfig </filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
生命周期:
1.在容器启动的时候立马创建
2.容器关闭时销毁
3.反复调用doFilter方法
多个过滤器的执行顺序取决于在web.xml中的配置顺序

2、拦截器

拦截器是用来拦截请求的,功能非常类似于过滤器,目的是为了在所有请求进入处理之前做一个统一的预处理操作 比如:权限校验 或者后处理

拦截器的使用步骤:
// 1.编写一个类并实现HandlerInterceptor接口
// 2.根据情况实现接口中的方法
//	preHandle:控制器方法(controller)执行之前 返回boolean类型,return true表示放行return false表示不再继续访问后期资源
//	postHandle:控制器方法(controller)执行之后
//	afterCompletion:视图渲染完成之后
// 3.在springmvc.xml中将定义好的拦截器作为一个组件注册的IOC容器
public class MyInterCeptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
<!-- 在springmvc.xml中将定义好的拦截器作为一个组件注册的IOC容器 -->
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/**" />
		<mvc:exclude-mapping path="/login"/>
		<bean class="com.qf.mvc02.interceptor.MyInterceptor"></bean>
	</mvc:interceptor>
</mvc:interceptors>
过滤器与拦截器的区别:
1.过滤器是属于servletAPI的部分,而拦截器属于SpringMVC框架的
2.过滤器是在请求到达前端控制器之前执行,而拦截器是在前端控制器之后
3.过滤器可以拦截包括jsp在内的所有请求,而拦截器不能拦截jsp
4.所属的容器不一样 过滤器属于tomcat容器 拦截器属于SpringMVC的IOC容器,被IOC进行管理的,因此在拦截器中可以注入IOC容器中的其他资源,但是不能在过滤器中注入IOC中的对象

3、异常处理器

针对项目运行时产生的异常不要进行try catch捕获处理,而是让他们默认向上进行声明,最终所有的异常全部抛给了前端控制器,由前端控制器调用异常处理器进行项目中异常的统一处理

使用步骤:
1.编写一个异常处理器类并实现HandlerExceptionResolver接口
2.实现resolveException方法,设计异常的具体的处理过程
3.将自定义的异常处理器注册到SpringMVC的IOC容器中,由前端控制器调用异常处理器进行项目中异常的统一处理
public class MyExceptionHandler implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        return null;
    }
}
<!-- 将自定义的异常处理器注册到SpringMVC的IOC容器中,由前端控制器调用异常处理器进行项目中异常的统一处理 -->
<!--配置全局异常处理器-->
<bean class="com.qf.mvc02.exception.CustomExceptionHandler"/>

4、监听器

监听器:Listener接口下定义了8个子接口,我们只需要掌握一个即可:ServletContextListener,用来监听ServletContext对象的出生,一般监听到之后程序中可以做一些初始化的工作。
ServletContextListener:监听ServletContext对象创建\销毁事件

public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }
}

SpringBoot

1、过滤器

使用步骤:
通过RegistrationBean注册
@Configuration
public class ServletConfig {
	@Bean
	public ServletRegistrationBean myServlet(){
		MyServlet myServlet=new MyServlet();
		ServletRegistrationBean bean=new ServletRegistrationBean(myServlet,"/my");
		return bean;
	}
	@Bean
	public FilterRegistrationBean myFilter(){
		MyFilter myFilter=new MyFilter();
		FilterRegistrationBean bean=new FilterRegistrationBean();
		bean.setFilter(myFilter);
		bean.setUrlPatterns(Arrays.asList("/*"));
		return bean;
	}
}

2、拦截器

使用步骤:
1、第一步:自定义一个类实现HandlerInterceptor接口
2、使用@Component注解将拦截器注册到IOC容器
@Component
public class MyInterCeptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}
3、编写一个配置类实现WebMvcConfigurer【代替.xml配置文件】
//相当于是一个配置文件
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
	@Autowired
	private MyInterCeptor myInterCeptor ;
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(myInterCeptor )
		.addPathPatterns("/**")
		.excludePathPatterns("/login","/checkcode","/js/**","/page/**","/img/**");
		}
	}
}

3、异常处理器

通过注解配置异常处理器,使用@ControllerAdvice+@ExceptionHandler注解来自定义全局异常处理

@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public String handleException1(Exception e){
        return e.getMessage();
    }
    @ExceptionHandler(ClassCastException.class)
    @ResponseBody
    public String handleException2(Exception e){
        return e.getMessage();
    }
}