SpringMVC中HandlerInterceptor拦截器及接口中三个方法介绍

一、前言:

当用到强制登陆操作时,要用到拦截器,下面介绍一下 HandlerInterceptor接口中三个方法

二、实现方法过程:

在这里插入图片描述
创建类实现HandlerInterceptor接口之后,jdk1.8之前如果没有实现三个preHandle、postHandle、afterHadnle方法会报错,由于jdk1.8的新特性,这里不会报错,需要手动实现三个方法,
idea快捷键:Alt+Inset,点击Implements Methods
在这里插入图片描述
选中三个方法,点击ok,即可手动实现三个方法;
在这里插入图片描述

三、三个方法介绍

public boolean preHandle

调用时间: Controller方法处理之前【也就是路径跳转之前】;

执行顺序: 链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行;

返回值: 返回值为true,则继续执行,false中断执行,生成时默认false;

应用场景: 常用于强制登陆等操作

public void postHandle

调用前提: preHandle返回true;

调用时间: Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作

执行顺序: 链式Intercepter情况下,Intercepter按照声明的顺序倒着执行。

备注: postHandle虽然post打头,但post、get方法都能处理

public void afterCompletion

调用前提:preHandle返回true

调用时间:DispatcherServlet进行视图的渲染之后

应用场景:多用于清理资源,统一日志处理,统一异常处理

代码如下:


//拦截器
public class MyHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        
            return  false;
        }
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

粘上强制登陆的代码,仅供参考:

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        Object flag = session.getAttribute("flag");//获取登陆时存放入session作用域中的标识flag
        if(flag!=null){  //flag不为空,说明登陆成功
            return  true;
        }else {  //flag为空,说明登陆失败,跳转到登陆页面
            response.sendRedirect(request.getContextPath()+"/login.jsp");
            return  false;
        }
    }

四、拦截器的配置:

使用HandlerInterceptor拦截器需要在springMVC-servlet.xml中配置如下:

    <!--强制登陆拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/> <!-- xml文件里 '/**'表示拦截所有请求路径 -->
            <!--不拦截如下路径:-->
            <!-- 不拦截1-登陆-->
            <mvc:exclude-mapping path="/manager/selectByName.do"/>
            <!--不拦截2-注册-->
            <mvc:exclude-mapping path="/manager/insert.do"/>
            <!--不拦截3-验证码Controller-->
            <mvc:exclude-mapping path="/manager/validateCode.do"/>
            <bean class="com.xxx.util.MyHandlerInterceptor"/>  <!--根据自己的MyHandlerInterceptor类位置修改 -->
        </mvc:interceptor>
    </mvc:interceptors>

在pom.xml文件里导入依赖:

    <!--hutool 用于生成验证码-->
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.4.1</version>
    </dependency>

准备工作就绪,接着就可以愉快使用拦截器了~

Java拦截器是在请求到达目标方法之前或之后,对请求进行拦截、处理或修改的一种机制。在SpringMVC,可以通过实现HandlerInterceptor接口来编写拦截器。 下面是一个实现拦截器的示例: 1. 创建一个类实现HandlerInterceptor接口,并实现其三个方法:preHandle、postHandle和afterCompletion。 ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行调用(Controller方法调用之前) System.out.println("拦截器 preHandle 方法被调用"); return true; // 只有返回true才会继续向下执行,返回false取消当前请求 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) System.out.println("拦截器 postHandle 方法被调用"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于进行资源清理工作) System.out.println("拦截器 afterCompletion 方法被调用"); } } ``` 2. 在SpringMVC的配置文件配置拦截器。 ```xml <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 上述代码,将拦截器配置为对所有请求进行拦截。也可以根据需要进行配置。 通过以上配置,拦截器就可以在请求到达Controller之前、之后和整个请求结束后执行相应的操作。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木泽锐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值