Spring MVC可以对请求进行拦截,你也可以自己定义一个拦截器来实现自己想要的功能,只需要实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter 适配器类。
我这里使用实现接口的方式:需要Override接口的三个方法 preHandle、postHandle、afterCompletion
它们的执行顺序稍后呈现。
一(单个拦截器):
1.代码:
package net.lxl.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("......preHandle...........");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("......postHandle..........");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("......afterCompletion.........");
}
}
2.配置拦截器---->springmvc.xml
<mvc:interceptors>
<!-- 声明自定义拦截器 -->
<bean id="firstHandlerInterceptor"
class="net.lxl.interceptor.MyFirstInterceptor"></bean>
</mvc:interceptors>
3.页面(测试代码)
<a href="helloe">interceptor....</a>
4.Controller代码
@GetMapping("helloe")
public String interceptor(){
System.out.println("Controller....");
//int a=100/0;
return "hh";
}
5.执行结果
6.分析
可以看出当前端页面发出请求后先进入prehandle---->然后进入controller—>postHandle---->前端页面----->afterCompletion
7.猜想
1).preHandle返回false
结果:
在prehandle后停止执行.不进入controller
2).Controller出现异常
结果:
页面报错:
后台代码:
看出:在controller中出现异常后不运行postHandle 而直接运行afterHandle
二(多个拦截器):
1.代码
package net.lxl.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MySecondInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Second Prehandle......");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("second postHandle.....");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("second afterCompletion......");
}
}
2.配置
<mvc:interceptors>
<!-- 声明自定义拦截器 -->
<bean id="firstHandlerInterceptor"
class="net.lxl.interceptor.MyFirstInterceptor"></bean>
<bean id="MySecondInterceptor"
class="net.lxl.interceptor.MySecondInterceptor"></bean>
</mvc:interceptors>
3.运行
结果:
4.分析执行流程:
5.猜想:
1)第二个preHandle返回false
结果:
直接执行第一个拦截器的afterCompletion
2)Controller中发生异常
结果: