【springMVC核心】第二弹

3.拦截器

一个拦截器的执行;

        项目:interceptor。

        自定义拦截器

拦截器:

        (1)拦截器是springmvc中的一种,需要实现HandlerInterceptor接口。

        (2)拦截器是拦截用户的请求,做请求判断处理的。

        (3)拦截器是全局的,可以对多个Controller做拦截

        一个项目中可以有0个或多个拦截器,它们在一起拦截用户的请求

        拦截器常用在:用户登录处理,权限检查,记录日志。

拦截器的使用步骤:

        1.定义类实现HandlerInterceptor接口

        2.在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。

拦截器的执行时间:

        1)在请求处理之前,也是controller类中的方法执行之前先被拦截

        2)在控制器方法执行之后也会执行拦截器

        3)在请求处理完成后也会执行拦截器

 

 perHandler:

 postHandler:

 afterCompletion:

 

package com.bjpowernode.handler;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

/**
 * @Description: 拦截器类:拦截用户的请求
 * @Author : Jerry
 * @create : 2022-04-19 17:28
 */
public class MyInterceptor implements HandlerInterceptor {

    private long btime = 0;

    /**
     *
     * preHandle 预处理方法
     * 参数:
     *      Object handler:被拦截的控制器对象
     * 返回值:boolean
     *      true:请求是通过了拦截器的验证,可以执行处理器方法。
     *              拦截器的MyInterceptor的preHandle()执行
     *              ===执行MyController指定的doSome方法===
     *              拦截器的MyInterceptor的postHandle()执行
     *              拦截器的MyInterceptor的afterCompletion()执行
     *      false:请求没有到达拦截器的验证,请求到拦截器就截止了。请求没有被处理
     *              拦截器的MyInterceptor的preHandle()执行
     *
     * 特点:
     *  1.方法在控制器方法(MyController的doSome)之前先执行的
     *      用户的请求先到达此方法
     *  2.在这个 方法中可以获取请求的信息,验证请求是否符合要求。
     *      可以验证用户是否登录,验证用户是否有权限访问某个链接地址(url)
     *      如果验证失败,可以截断请求,请求不能被处理。
     *      如果验证成功,可以放行请求,此时控制器方法才能执行。
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
        btime = System.currentTimeMillis();
        System.out.println("拦截器的MyInterceptor的preHandle()执行");
        //给浏览器一个返回结果
        request.getRequestDispatcher("/tips.jsp").forward(request, response);
        return false;
    }

    /**
     * postHandle 后处理方法。
     * 参数:
     *      Object handler:被拦截的控制器对象
     *      ModelAndView mv:处理器方法的返回值
     * 特点:
     *      1.在处理器方法返回之后执行的(MyController.doSome())
     *      2.能够获取到处理器方法的返回值ModelAndView,可以影响到ModelAndView
     *          中的数据和视图,可以影响到最后的执行结果
     *      3.主要对原来的执行结果做二次修正,
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv){
        System.out.println("拦截器的MyInterceptor的postHandle()执行");
        //对原来的doSome执行结果,需要调整。
        if(mv!=null){
            //修改数据
            mv.addObject("mydate", new Date());
            //修改视图
            mv.setViewName("other");
        }
    }

    /**
     * afterCompletion:最后执行的方法
     * 参数:
     *      Object handler:被拦截的控制器对象
     *      Exception ex: 程序中发生的异常
     * 特点:
     *      1.在请求处理完成后执行的。框架中规定是你的视图处理完成之后,对视图执行了forward。就认为请求处理完成
     *      2.一般做资源回收工作的,程序中创建了一些对象,在这里可以删除,把占用的内存回收
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex){
        System.out.println("拦截器的MyInterceptor的afterCompletion()执行");

        long etime = System.currentTimeMillis();
        System.out.println("计算从preHandle到请求处理完成的时间:"+(etime-btime));

    }
}

声明多个拦截器;

        在框架中保存多个拦截器是ArrayList,

        按照声明的先后顺序放入到ArrayList        

 多个拦截器的执行图:

 

 

过滤器和拦截器的区别:

        1.过滤器是servlet中的对象,拦截器是框架中的对象

        2.过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor

        3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的

          拦截器是用来验证请求的,能截断请求。

        4.过滤器是在拦截器之前先执行的。

        5.过滤器是tomcat服务器创建的对象

          拦截器是springmvc容器中创建的对象

        6.过滤器是一个时间点

          拦截器有三个执行时间点

        7.过滤器可以处理jsp,js,html等等

           拦截器是侧重拦截对Controller 的对象。

           如果你的请求不能被DispatcherServlet接收,这个请求不会执行拦截器内容

        8.拦截器拦截普通类方法执行,过滤器过滤servlet请求响应

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值