创建拦截器
- 拦截器作用的时机
- 流程
- 浏览器发出http请求
- 请求首先经过过滤器
- 再到DispacherSerlvet
- 再到prehandle(前置拦截器)
- 再到控制器方法(Handle方法)
- 再到postHandle(后置拦截器)
- 最后到afterCompletion(视图渲染之后处理)
- 创建一个类实现HandlerInterceptor接口和它的三个抽象方法
public class FirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
- 配置拦截器的bean在springmvc配置文件中,将自己的拦截器配置到里面去
<!--<mvc:interceptors>
<ref bean="firstInterceptor" />
<ref bean="secondInterceptor" />
bean和ref标签所配置的拦截器默认对DispatcherServlet处理的所有的请求进行拦截
<bean class="com.atguigu.interceptor.FirstInterceptor"/>
<ref bean="firstInterceptor" />
//下面是配置单个拦截器具体的参数
<mvc:interceptor>
配置需要拦截的请求的请求路径,/**表示所有请求,/*在这里只表示一层目录的请求
<mvc:mapping path="/**">
配置需要排除拦截的请求的请求路径
<mvc:exclude-mapping path="/abc">
配置拦截器
<ref bean="firstInterceptor">
</mvc:interceptor>
</mvc:interceptors>-->
- preHandle方法的返回值是一个布尔类型,表示是否对请求放行
拦截器顺序和某一个pre拦截器返回false
-
拦截器的执行顺序与我们在SpringMVC中的配置顺序有关(一般默认SpringMVC的默认拦截器放在第一位,如果你的请求是被视图控制器处理了,就是那个写在配置文件里的视图跳转,那么会多一个拦截器在第一位)
-
prehandler方法是和第一条一致
-
posthandler方法是和第一条相反的顺序
-
如果在拦截器顺序中存在一个prehandler返回是false,那么拦截器就不会放行
异常处理器
- 处理控制器方法中出现的异常,由于出现异常,控制器方法返回的ModelAndView将会被设置异常信息的打印和异常页面的跳转
使用xml配置异常处理
- SpringMVC有它的默认异常处理器,打印错误信息跳转错误页面,我们也自己配置,配置如下
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- key设置要处理的异常,value设置出现该异常时要跳转的页面所对应的逻辑视图-->
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
<!-- 设置共享在请求域中的异常信息的属性名,方便跳转页面后打印错误信息-->
<property name="exceptionAttribute" value="ex"></property>
</bean>
使用注解实现异常处理
- 通过@ControllerAdvice来标识一个异常处理控制器
- 通过@ExceptionHandler来标识该异常处理控制器方法处理的异常
- 通过传入Throwable形参来获得异常信息
- 其他的和普通控制器一致
- 示例
@ControllerAdvice
public class ExceptionController {
//设置要处理的异常信息
@ExceptionHandler(ArithmeticException.class)
public String handleException(Throwable ex, Model model){
//ex表示控制器方法所出现的异常
model.addAttribute("ex", ex);
return "error";
}
}