SpringMVC之拦截器

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中发生异常
结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值