拦截器是springMVC中的一个核心应用组件,主要用于处理多个Controller的共性问题,当我们的请求由DispatcherServlet派发到具体Controller之前首先要执行拦截器中的一些相关用法,在这些方法中可以对请求进行相应预处理,这些方法可以决定对这个请求进行拦截还是放行
拦截器如何编写?
自己编写springMVC拦截器需要实现handlerInterceptor接口或者继承此接口的实现类handlerInterceptorAdapter(继承这个类时可根据需求重写必要的方法)
springMVC拦截器链及配置实现
当我们体统中有多个拦截器时,这些拦截器可以构成一个拦截器链,其原理类似过滤器中的过滤链,在多个拦截器应用中仅当所有匹配的拦截器的preHandle()都执行之后,才会条用Controller中处理请求的方法,然后在执行所有匹配的拦截器的postHandler(),再执行所有匹配的拦截器的afterCompletion()
在拦截器链中,各拦截器的执行先后顺序取决于配置文件中配置的节点的先后顺序
1)拦截器对象何时创建?
启动时创建
2)拦截器对象在内存中有几份?
一份
3)拦截其中存在变量共享时可能会有线程安全问题吗?(有)
4)拦截其中存在变量共享时可能会有线程安全问题吗?(有)
5)多个拦截器对象如何共享数据?
通过request,session,ServletContext
6)拦截器对象的生命周期何时结束?
容器销毁时
7)拦截器可以解决什么问题?
Controller中共性问题,例如日志管理,系统监控,…
Spring MVC中异常处理机制总结
1)为什么要进行异常处理?
提高系统的容错能力,让系统表现的更加友好
2)Spring MVC中异常处理方式?
局部的,全局的
3)局部方式异常处理如何实现?
Controller类中直接定义异常处理方法,使用@ExceptionHandler进行修饰
4)全局方式异常处理如何实现?
通过继承将共性提取到父类或者通过@ControllerAdvice注解修饰类,然后类中定义异常处理方法
5)出现异常后,异常处理的具体机制是怎样的
首先会在当前Controller中查找有没有定义异常处理方法,假如有则查看注解中定义的异常类型是否与当前异常类型相匹配,假如匹配直接处理,假如不匹配则查看当前类中有没有父类类型的异常处理方法与异常匹配,假如有则直接处理,没有则找全局异常处理,全局也没有则直接不友好的输出错误信息
说明:实际项目中在Controller的方法中除了要对正确的业务数据进行封装之外,还会对异常信息进行封装,然后转换为json格式的字符串,输出到客户端