文章目录
- 一、SpringMVC 拦截器
- (一)拦截器的概念
- (二)拦截器的三个抽象方法
- (三)多个拦截器的执行顺序
- 二、SpringMVC 异常处理器
- (一)异常处理的重要性
- (二)基于配置的异常处理
- (三)基于注解的异常处理
- 三、总结
在 SpringMVC 框架中,拦截器(Interceptor)和异常处理器(Exception Handler)是两个非常重要的组件,它们分别在不同的方面为应用程序提供了强大的功能。本文将详细介绍 SpringMVC 中的拦截器和异常处理器,包括拦截器的三个抽象方法、多个拦截器的执行顺序,以及基于配置和注解的异常处理方式。
一、SpringMVC 拦截器
(一)拦截器的概念
拦截器是 SpringMVC 中一种强大的机制,它可以在请求处理的不同阶段进行干预,实现诸如日志记录、权限校验、性能监控等功能。拦截器可以拦截用户的请求,并在请求到达控制器之前或之后执行一些特定的操作。
(二)拦截器的三个抽象方法
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:- 这个方法在请求处理之前被调用。
- 返回值为
boolean
类型,如果返回true
,则表示继续执行后续的处理器(如控制器方法);如果返回false
,则中断后续的处理流程。 - 可以在这个方法中进行一些前置处理,比如权限校验、日志记录等。
- 例如:
@Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { System.out.println("preHandle 方法被调用"); // 进行权限校验 if (request.getSession().getAttribute("user") == null) { response.sendRedirect(request.getContextPath() + "/login.jsp"); return false; } return true; }
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:- 这个方法在请求处理之后,视图渲染之前被调用。
- 可以在这个方法中对模型数据进行修改,或者对响应进行一些额外的处理。
- 例如:
@Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { System.out.println("postHandle 方法被调用"); if (modelAndView!= null) { modelAndView.addObject("timestamp", System.currentTimeMillis()); } }
afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:- 这个方法在视图渲染之后被调用,无论请求处理是否成功都会执行。
- 可以在这个方法中进行一些资源清理、日志记录等操作。
- 例如:
@Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("afterCompletion 方法被调用"); }
(三)多个拦截器的执行顺序
当应用程序中配置了多个拦截器时,它们的执行顺序是有规律的。拦截器的执行顺序与它们在配置文件中的声明顺序一致。
- 首先,第一个拦截器的
preHandle
方法被调用。 - 如果第一个拦截器的
preHandle
方法返回true
,则继续执行下一个拦截器的preHandle
方法,依此类推,直到所有拦截器的preHandle
方法都被调用完毕。 - 然后,请求被转发到控制器方法进行处理。
- 控制器方法处理完成后,按照相反的顺序调用各个拦截器的
postHandle
方法。 - 最后,按照相反的顺序调用各个拦截器的
afterCompletion
方法。
例如,假设有两个拦截器Interceptor1
和Interceptor2
,它们的执行顺序如下:
Interceptor1.preHandle()
Interceptor2.preHandle()
- 控制器方法处理请求
Interceptor2.postHandle()
Interceptor1.postHandle()
Interceptor2.afterCompletion()
Interceptor1.afterCompletion()
二、SpringMVC 异常处理器
(一)异常处理的重要性
在应用程序的开发过程中,异常情况是不可避免的。如果不进行适当的处理,异常可能会导致应用程序崩溃,或者给用户返回不友好的错误信息。因此,在 SpringMVC 中,提供了强大的异常处理机制,可以对不同类型的异常进行统一的处理,提高应用程序的稳定性和用户体验。
(二)基于配置的异常处理
- 在 SpringMVC 的配置文件中,可以使用
<bean>
标签配置异常处理器。- 例如:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.ArithmeticException">error.jsp</prop> </props> </property> </bean>
- 在上面的配置中,当发生
java.lang.ArithmeticException
异常时,会跳转到error.jsp
页面进行错误处理。
- 可以配置多个异常映射,对不同类型的异常进行不同的处理。
(三)基于注解的异常处理
- 使用
@ControllerAdvice
注解定义一个全局的异常处理类。- 例如:
@ControllerAdvice public class GlobalExceptionHandler { }
- 在异常处理类中,可以使用
@ExceptionHandler
注解定义针对特定异常的处理方法。- 例如:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ArithmeticException.class) public ModelAndView handleArithmeticException(ArithmeticException ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error.jsp"); modelAndView.addObject("errorMessage", ex.getMessage()); return modelAndView; } }
- 在上面的代码中,当发生
ArithmeticException
异常时,会调用handleArithmeticException
方法进行处理,并返回一个包含错误信息的ModelAndView
对象,跳转到error.jsp
页面进行错误显示。
三、总结
SpringMVC 中的拦截器和异常处理器是非常强大的组件,它们可以帮助我们实现各种功能,提高应用程序的稳定性和可维护性。拦截器可以在请求处理的不同阶段进行干预,实现诸如权限校验、日志记录等功能;异常处理器可以对不同类型的异常进行统一的处理,提高应用程序的用户体验。在实际的开发过程中,我们可以根据具体的需求,灵活地使用拦截器和异常处理器,为应用程序提供更好的服务。