异常处理器
自定义的异常处理器
自定义异常处理器需要使用SimpleMappingExceptionResolver类
可以通过XML配置文件或者注解的方式进行设置
配置文件方式:springmvc.xml
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 可以配置多个键值对,key是异常,要提供具体的异常类型,包括包名 -->
<!-- 这里的配置表名只要出现了异常就跳转到tip视图 -->
<prop key="java.lang.Exception">tip</prop>
</props>
</property>
<!-- 将异常信息存储到request域,value属性用来指定存储时的key -->
<property name="exceptionAttribute" value="e" />
</bean>
注解方式
@ControllerAdvice
public class ExceptionController{
@ExceptionHandler
public String tip(Exception e,Model model){
model.addAttribute("e",e);
return "tip"
}
}
拦截器
概述
Spring MVC的拦截器作用是在请求到达控制器前或之后进行拦截,可以对请求和响应进行特定处理
拦截器和过滤器的区别
- 过滤器更注重在请求和响应的流程中进行处理,可以修改请求和响应的内容,列如设置编码和字符集、请求头、状态码等(属于servlet)
- 拦截器更加侧重于对控制器进行前置或后置处理,在请求达到控制器之前或之后进行特定的操作,列如打印日志,权限认证(属于Spring MVC)
执行顺序
filter-DispatcherServlet-interceptor-Controller-interceptor-DispatcherServlet-filter
拦截器的创建与基本配置
实现org.springframework.web.servlet.HandlerInterceptor
接口,选择性实现方法
- perHandle:处理器方法调用之前执行
- 只有该方法有返回值,返回值是布尔类型,true放行,false拦截
- postHandle:处理器方法调用之后执行
- afterCompletion:渲染完成后执行
springmvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 基本配置:方式1 -->
<!-- 基本配置会拦截所有的请求 -->
<!-- <bean class="com.atli.interceptors.Interceptor1" /> -->
<!-- 基本配置:方式2,需要对拦截器使用@Component注解 -->
<ref bean="interceptor1" />
</mvc:interceptors>
com.atli.interceptors.Interceptor1
@Component
public class Interceptor1 implements HandlerInterceptor{
@Override
public boolean perHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception{
System.out.println("Interceptor1's perHandle");
}
@Override
public boolean postHandle(HttpServletRequest request, HttpServletResponse response,Object handler ,ModelAndView modelAndView) throws Exception{
System.out.println("Interceptor1's postHandle");
}
@Override
public boolean afterCompletion(HttpServletRequest request, HttpServletResponse response,Object handler ,Exception ex) throws Exception{
System.out.println("Interceptor1's afterCompletion");
}
}
拦截器的高级配置
springmvc.xml
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有路径 -->
<mvc:mapping path="/**" />
<!-- 不拦截/test路径 -->
<mvc:exclude-mapping path="/teest" />
<!-- 拦截器 -->
<ref bean="interceptor1">
</mvc:interceptor>
</mvc:interceptors>
拦截器的执行顺序
如果拦截器的preHandle都返回true则会根据配置文件中顺序进行拦截
这里假设有三个拦截器分别是A,B,C,它们同时作用于处理器方法X,那么其执行顺序为:preHandle(A->B->C)->X->postHandle(C->B->A)->渲染页面->afterCompletion(C->B->A)
如果拦截器的preHandle存在返回false,那么该拦截器和后续拦截器的postHandle和afterCompletion均不会执行,且所有的postHandle,处理器方法都不会被执行
同样的使用上面的例子,不过B的preHandle返回false
preHandle(A->B)->afterCompletion(A)