day41:springmvc拦截器
拦截器步骤
1.新建maven web项目
2.加入依赖
3.创建controller类
4.创建一个普通类,作为拦截器使用
(1)实现HandlerInterceptor接口
(2)实现接口中的三个方法
5.创建show.jsp
6.创建springmvc的配置文件
(1)组件扫描器,扫描@Controller注解
(2)声明拦截器,指定拦截的请求uri地址
(1)创建普通类实现拦截器HandlerInterceptor接口,实现三个方法
// 拦截器类:拦截用户请求
public class StudentInterceptor implements HandlerInterceptor{
/**
* preHandle:叫做预处理方法。
* 重要:是整个项目的入口,门户。请求需要从这里进入。
* 当preHandle返回true 请求可以被处理
* preHandle返回false,请求到此方法就截止
* @param request
* @param response
* @param handler:Object类型,指被拦截的对象
* @return boolean
* true:请求时通过了拦截器的验证,可以执行处理器方法
* false:请求没有通过拦截器的验证,请求到达拦截器就截止了。请求没有被处理
*
* @throws Exception
*
* 特点:
* 1.方法在控制器方法(StudentController的addStudent)之前先执行
* 用户的请求首先到达此方法
* 2.在这个 方法中可以获取请求的信息,验证请求是否符合要求。
* 可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)
* 如果验证失败,可以截断请求,请求不能被处理。
* 如果验证成功,可以放行请求,此时控制器方法才能执行。
*/
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
System.out.println("拦截器的preHandle方法执行");
return true;
}
/**
* postHandle:后处理的方法
*
* @param request
* @param response
* @param handler :被拦截的处理器对象,例如:处理器对象StudentController
* @param modelAndView :处理器方法的返回值
* @throws Exception
*
* 特点:
* 1.在处理器方法之后执行的(tudentController.addStudent)
* 2.能够获取到处理器方法的返回值ModelAndView,可以求改ModelAndView中的数据和视图,
* 可以影响到最后的执行结果。
* 3.主要是对原来的执行结果做二次修正
*/
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("拦截器的postHandle方法执行");
// 对原来的addStudent执行结果进行调整
if (modelAndView != null){
modelAndView.addObject("mydate", new Date());
modelAndView.setViewName("other");
}
}
/**
* afterCompletion:最后的执行方法
* @param request
* @param response
* @param handler :被拦截器的处理器对象
* @param ex :程序中发生的异常
* @throws Exception
* 特点:
* 1.在请求处理完成后执行的。框架中规定是当你的视图处理完成后,对视图执行了forward。就认为请求结束
* 2.一般做资源回收工作的,程序请求过程中创建了一些对象,在这里可以删除,把占用的内存回收。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("拦截器的afterCompletion方法执行");
}
}
(2)springmvc配置文件声明拦截器
<!-- 声明拦截器:拦截器可以有0或多个-->
<mvc:interceptors>
<!-- 声明第一个拦截器-->
<mvc:interceptor>
<!-- path:指定拦截的请求uri地址,可以使用通配符 **
**:表示任意的字符,文件或者多级目录和目录中的文件
localhost:8080/myWeb/user/addUser
/user/**: 代表/user/下的多有路径都拦截
-->
<mvc:mapping path="/**"/>
<!-- 声明拦截器对象-->
<bean class="com.itcast.handler.StudentInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器执行顺序
多个拦截器执行图解
拦截器和过滤器区别
1.过滤器是tomcat创建的对象,拦截器是springmvc创建的对象
2.过滤器是servlet中的对象,拦截器是实现HabdlerInterceptor
3.过滤器是用来设置request,response的参数,属性的,侧重于数据库过滤的:过滤敏感字符等。 拦截器是用来验证请求的,能截断请求。
4.过滤器实在拦截器之前先执行
5.过滤器有一个执行时间点,拦截器有三个执行点
6.过滤器可以处理jsp,js,html等 拦截器侧重拦截对Controller的对象,如果你的请求不能被DispatcherServlet接收, 这个请求不会执行拦截器内容。
7.拦截器拦截普通类方法执行,过滤器过滤Servlet请求响应
拦截器和过滤器的执行图解