- <mvc:interceptors>
-
-
-
- <mvc:interceptor>
-
- <mvc:mapping path="/**"/>
-
- <mvc:exclude-mapping path="/abc"/>
-
- <ref bean="firstInterceptor"/>
- mvc:interceptor>
- mvc:interceptors>
代码示例:
index.html 代码:
- <head>
- <meta charset="UTF-8">
- <title>首页title>
- head>
- <body>
- <h1>首页h1>
- <a th:href="@{/test/hello}">测试拦截器a>
- body>
success.html 代码:
- <head>
- <meta charset="UTF-8">
- <title>成功title>
- head>
- <body>
- <h1>Hello Worldh1>
- body>
控制层代码:
- @Controller
- public class TestController {
-
- @RequestMapping("/test/hello")
- public String testHello() {
- return "success";
- }
- }
- @Component
- public class FirstInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("FirstInterceptor --> preHandle");
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("FirstInterceptor --> postHandle");
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("FirstInterceptor --> afterCompletion");
- }
- }
结果:点击首页中的超链接

preHandle:控制器方法执行之前执行preHandle(),其boolean类型的返回值表示是否拦截或放行,返回true为放行,即调用控制器方法;返回false表示拦截,即不调用控制器方法postHandle:控制器方法执行之后执行postHandle()afterCompletion:处理完视图和模型数据,渲染视图完毕之后执行afterCompletion()
- @Component
- public class FirstInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("FirstInterceptor --> preHandle");
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
- System.out.println("FirstInterceptor --> postHandle");
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
- System.out.println("FirstInterceptor --> afterCompletion");
- }
- }
SecondInterceptor.java
- @Component
- public class SecondInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- throws Exception {
- System.out.println("SecondInterceptor --> preHandle");
- return true;
- }
-
- @Override
- public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
- throws Exception {
- System.out.println("SecondInterceptor --> postHandle");
- }
-
- @Override
- public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
- throws Exception {
- System.out.println("SecondInterceptor --> afterCompletion");
- }
- }
springmvc.xml:
- <mvc:interceptors>
- <ref bean="firstInterceptor"/>
- <ref bean="secondInterceptor"/>
- mvc:interceptors>
结果:点击首页中的超链接:

结果:点击首页中的超链接:

-
- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
- <property name="exceptionMappings">
- <props >
-
- <prop key="java.lang.ArithmeticException">errorprop>
- props>
- property>
-
- <property name="exceptionAttribute" value="ex"/>
- bean>
代码示例:
创建页面 error.html:
- <head>
- <meta charset="UTF-8">
- <title>错误title>
- head>
- <body>
- <h1>ERRORh1>
- <h2 th:text="${ex}">h2>
- body>
修改控制器方法:
- @RequestMapping("/test/hello")
- public String testHello() {
- System.out.println(1 / 0);
- return "success";
- }
结果:点击首页中的超链接:
- // @ControllerAdvice 将当前类标识为异常处理的组件
- @ControllerAdvice
- public class ExceptionController {
-
- // @ExceptionHandler用于设置所标识方法处理的异常(数组)
- @ExceptionHandler(ArithmeticException.class)
- public String handleArithmeticException(Exception exception,Model model) {
- // 将异常信息保存到 Request 域中
- model.addAttribute("ex", exception);
- return "error";
- }
- }