SpringMVC拦截器
- Springmvc中的拦截器interceptor用于对控制器controller进行预处理和后处理的技术;
- 可以定义拦截器链,拦截器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。
- 拦截器利用的是AOP思想;在控制器前后进行处理的操作
- 自定义拦截器,需要实现HandlerInterceptor接口
SpringMVC拦截器与过滤器区别
我们在配置过滤器的时候,实在web.xml中进行配置的
- 过滤器是servlet中的,任何框架都可以使用过滤器技术;
- 拦截器是Springmvc所独有的
- 过滤器设置/*可以拦截任何资源
- 拦截器只对控制器controller中的方法进行拦截
SpringMVC拦截器
SpringMVC中的拦截器用于拦截控制器方法的执行
SpringMVC中的拦截器需要实现HandlerInterceptor
SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:
使用SpringMVC自定义拦截器
编写自定义拦截器类
自定义拦截器类实现HandlerInterceptor接口,重写其中三个方法之一的preHandle()方法
//自定义的拦截器实现该接口
//拦截器在Spring中特有的,类似AOP方法,在控制器方法执行前后进行处理
public class interceptorTest implements HandlerInterceptor {
// 表示control的方法执行前
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("interceptor before");
System.out.println(" return true ");
return true;
}
// 在controller中方法执行后,返回jsp视图执行之前执行此方法
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(" as aop befor,after in controller ");
}
// 跳转页面后执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(" page success interceptor afterMethod ");
}
}
SpringMVC配置拦截器
<!--配置拦截器interceptor-->
<mvc:interceptors>
<mvc:interceptor>
<!--/*表示拦截所有的请求-->
<mvc:mapping path="/*"/> <!--拦截的路径,路径都是controller中的方法路径-->
<!--<mvc:exclude-mapping path="/account/testSpringmvc"/> <!–不拦截的路径–>-->
<bean class="cn.Interceptor.interceptorTest"/> <!--指定自定义的拦截器类-->
</mvc:interceptor>
</mvc:interceptors>
因为我设定的拦截器拦截所有的请求。所以发送任何请求都会进行拦截操作
类似AOP,只是进行访问,调用了控制器中的方法。触发拦截器
HandlerInterceptor接口中的三个方法分析
preHandler()
拦截在controller中方法执行之前,执行,这是拦截器主要用到的方法
可以使用request或者response跳转到指定的页面
return true 代表放行 return false 代表不放行
postHandler()
在controller中方法执行后,返回jsp视图执行之前执行此方法
1). 可以使用request或者response跳转到指定的页面
2). 如果指定了跳转的页面,那么controller方法跳转的页面将不会显示。
afterCompletion()
在跳转页面后执行此方法
无法通过request或response跳转页面了
在SpringMVC底层中Hander表示的就是控制器类。SpringMVC的执行流程中会提到
配置多个拦截器
若每个拦截器的preHandle()都返回true
此时多个拦截器的执行顺序和拦截器在SpringMVC的配置文件的配置顺序有关: preHandle()会按照配置的顺序执行,而postHandle()和afterComplation()会按照配置的反序执行
若某个拦截器的preHandle()返回了false
preHandle()返回false和它之前的拦截器的preHandle()都会执行,postHandle()都不执行,返回false 的拦截器之前的拦截器的afterComplation()会执行
小结
拦截器,属于Spring中的。
功能类是AOP操作,在调用Controller方法的前后中进行操作。前决定是否进行放行
异常处理器
SpringMVC提供了一个处理控制器方法执行过程中所出现的异常的接口:HandlerExceptionResolver HandlerExceptionResolver接口的实现类有:DefaultHandlerExceptionResolver(默认的异常处理)和 SimpleMappingExceptionResolver SpringMVC提供了自定义的异常处理器
表示在控制器方法中出现异常。会进行跳转到你指定的异常页面
在微服务架构中存在服务熔断,当服务出现错误,存在一个应急方案。有点意思但是不是同一个概念
SimpleMappingExceptionResolver,使用方式:
基于配置的操作
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--
prop的键表示处理器方法执行过程中出现的异常
prop的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面
-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<!--
exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享
-->
<property name="exceptionAttribute" value="ex"></property>
</bean>
控制器
@RequestMapping("/mathexception")
public String MathException() {
//可以看到这个控制一定会出现 算数异常
int a = 10 / 0;
return "show";
}
基于注解的异常操作
//@ControllerAdvice将当前类标识为异常处理的组件
@ControllerAdvice
public class ExceptionController {
//@ExceptionHandler用于设置所标识方法处理的异常
@ExceptionHandler(ArithmeticException.class)
//ex表示当前请求处理中出现的异常对象
public String handleArithmeticException(Exception ex, Model model) {
model.addAttribute("ex", ex);
return "error";
}