什么时拦截器
springMVC的拦截器就相当于servlet开发中的过滤器Filter,用于对请求进行处理以及预处理。将拦截器按照一定的顺序链接成一条链这条链被称为拦截器链,在访问被拦截的方法或者是字段时,拦截器链中的拦截器就会按照之前定义的顺序进行执行,拦截器也是AOP思想的具体实现。
拦截器与过滤器的区别:
自定义拦截器的开发步骤:
- 创建拦截器的实现类:实现接口 HandlerInterceptor
- 在springMVC配置文件中进行配置拦截器。
- 测试拦截器的拦截效果。
创建拦截器的实现类:
public class MyIntercepoter implements HandlerInterceptor {
//在目标方法执行之前进行执行。
//参数中 有springMVC封装的 request respond对象 可以用他们来进行操作创痛Sevlet开发中额所有操作
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("目标方法之前执行");
String username = request.getParameter("username");
if ("xiaozhang".equals(username))
return true;
else//返回的boolean的 如果是flase的话 就表示 对资源不放行,下面的方法也就执行不了【这样的话下面所有的操作都将无法执行】 true表示放行通过这个就可以实
// 现拦截操作
{
//request.getRequestDispatcher("/jsp/error.jsp").forward(request,response);
//使用请求重定向的话就是两次请求了,还会在次经过拦截器
response.sendRedirect("http://localhost:8080/SpringSSM_war_exploded/save15");
return false;
}
}
//在目标方法执行之后进行执行,视图返回之前执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("目标方法执行之后进行执行,返回视图之前");
//这个方法的参数中同样封装了request,response,以及ModelAndView 其中ModelAndView属性可以获取
// ,目标资源 你自己创建的ModelAndView对象,在这里可以对目标资源中ModelAndView设置的一些属性进行一些操作
modelAndView.addObject("suername","xaiozhang"); //这里的modelAndView和目标资源中的modelAndView对象是一个对象
modelAndView.setViewName("sds");
}
//在整个流程都执行完毕之后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("这个流程执行完毕");
}
}
preHandle()
- 方法是在目标方法执行之前进行执行。
- 方法的参数包含HttpServletRequest request, HttpServletResponse response对象,通过这两个参数就可以进行实现操作servlet开发中的方法,比如实现登录拦截,日志控制等。
- 返回值是一个boolean 类型,如果返回值是true的话,才会继续执行后面的方法,如果返回flase的话则不会执行后面的方法。
postHandle()
- 方法的执行时间是目标方法执行之后,返回视图之前进行执行。
- 方法中的参数包含HttpServletRequest , HttpServletResponse, ModelAndView 类型的对象,所以也可以实现servlet的操作。同时ModelAndView类型的参数是接收的目标方法的参数,也就是目标方法的ModelAndView和postHandle()方法中的ModelAndView参数是同一个对象,所以使用ModelAndView参数可以修改目标方法设置的模型,以及返回的视图。
afterCompletion()
- 方法的执行时间是在目标方法执行之后,最后进行执行。
- 方法的参数包含HttpServletRequest , HttpServletResponse, Exception 。所以也是可以执行servlet的操作,最后可以通过Exception来设置异常的信息等异常相关的操作。
在springMVC配置文件中进行配置注册拦截器
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 表示对那些资源进行拦截操作-->
<mvc:mapping path="/**"/>
<!-- 表示使用那写拦截器实现对那些资源的拦截-->
<bean class="com.itheima.zhujie.intercepoter.MyIntercepoter"/>
</mvc:interceptor>
</mvc:interceptors>
由上图可知,配置拦截器需要引入mvc的空间。
拦截器链
连接器链的执行流程:
拦截器链的执行流程,和配置拦截器的顺序有关。
示例代码:
<!-- 配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 表示对那些资源进行拦截操作-->
<mvc:mapping path="/**"/>
<!-- 表示使用那写拦截器实现对那些资源的拦截-->
<bean class="com.itheima.zhujie.intercepoter.MyIntercepoter"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.itheima.zhujie.intercepoter.MyIntercepoter1"/>
</mvc:interceptor>
</mvc:interceptors>