转载自 https://blog.csdn.net/weixin_36832313/article/details/79115693

简介

SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对请求进行拦截和处理。

常见应用场景

1、权限检查:如检测请求是否具有登录权限,如果没有直接返回到登陆页面。 
2、性能监控:用请求处理前和请求处理后的时间差计算整个请求响应完成所消耗的时间。 
3、日志记录:可以记录请求信息的日志,以便进行信息监控、信息统计等。

使用方法

1、配置文件

<mvc:interceptors><!--对所有的请求记性拦截--><!--<beans:beanclass="com.sunp.common.interceptor.Myinterceptor"/>--><!--对特定的请求进行拦截--><mvc:interceptor><!--进行拦截的路径--><mvc:mapping path="/**"/> <!--不进行拦截的路径-->   <mvc:exclude-mapping path="/lib/**" /> <beans:bean class="com.sunp.common.interceptor.Myinterceptor"/></mvc:interceptor>
</mvc:interceptors>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、实现接口并继承方法(可以同时包含多个实现类)

public class myInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandler(HttpServletRequest request, HttpServletResponse response, Object obj)throws Exception{/*该方法将在请求处理之前进行调用,只有该方法返回true,才会继续执行后续的Interceptor和Controller,当返回值为true 时就会继续调用下一个Interceptor的preHandle 方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法;*/}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response,Object obj,Exception e)throws Exception {/*该方法将在请求处理之后,DispatcherServlet进行视图返回渲染之前进行调用,可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。*/}@Overridepublic void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,Object arg2,ModelAndView arg3) throws Exception {/*该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。用于进行资源清理。*/}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

执行顺序

1、单个实现类的执行顺序

preHandler -> Controller -> postHandler -> model渲染-> afterCompletion

2、多个实现类的执行顺序

———————preHandler1——————- 
———————preHandler2——————- 
———————preHandler3——————- 
———————–Controller——————— 
———————postHandler3—————— 
———————postHandler2—————— 
———————postHandler1—————— 
———————postHandler1—————— 
——————afterCompletion3—————- 
——————afterCompletion2—————- 
——————afterCompletion1—————-

简单练习代码

http://download.csdn.net/download/weixin_36832313/10215829

---------------------------------------------------------------------------------

package com.ibank.admin.ws.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.ibank.admin.service.AdminRedisService;
import com.tasfe.framework.redis.RedisService;
import com.tasfe.framework.support.model.ResponseData;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

/**
 * Created by Dengw on 2018/1/4
 */
@Component
public class LoginInteceptor implements HandlerInterceptor{

private static Logger logger = LoggerFactory.getLogger(LoginInteceptor.class);
    @Autowired
    private AdminRedisService adminRedisService;

@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String accountNo = request.getHeader("accountNo");
        String token = request.getHeader("token");
        boolean judgeFlag = adminRedisService.judgeTimeout(accountNo,token);
        if(!judgeFlag){
            response.setContentType("application/json");
            response.setCharacterEncoding("UTF-8");
            ResponseData responseData = ResponseData.error("登录超时,请重新登录!");
            responseData.setStatus("2");
            PrintWriter printWriter = response.getWriter();
            printWriter.write(JSONObject.toJSONString(responseData));
            printWriter.flush();
            printWriter.close();
            return false;
        }
        return true;
    }

@Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
    }

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

}

HandlerInterceptor拦截器使用总结相关推荐

  1. WebMvcConfigurer配置HandlerInterceptor拦截器失效

    1.前言 Springboot2.0之前,实现拦截器功能的配置类是通过继承(extends)WebMvcConfigurerAdapter类完成的,最近项目把Springboot升级到了Springb ...

  2. Spring HandlerInterceptor 拦截器实战

    我是陈皮,一个在互联网 Coding 的 ITer,个人微信公众号「陈皮的JavaLib」关注第一时间阅读最新文章. 文章目录 HandlerInterceptor 详解 preHandle post ...

  3. HandlerInterceptor拦截器的使用

    https://blog.csdn.net/sinat_32023305/article/details/81284518

  4. (转)spring中的拦截器(HandlerInterceptor+MethodInterceptor)

    1.  过滤器跟拦截器的区别 在说拦截器之前,不得不说一下过滤器,有时候往往被这两个词搞的头大. 其实我们最先接触的就是过滤器,还记得web.xml中配置的<filter>吗~ 你应该知道 ...

  5. HandlerInterceptor 处理器拦截器的用法

    SpringMVC 中的HandlerInterceptor 拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. (如无特殊说明,下文所说的拦截器即处理器拦截器) ...

  6. Spring MVC学习(8)—HandlerInterceptor处理器拦截器机制全解

    基于最新Spring 5.x,详细介绍了Spring MVC的HandlerInterceptor处理器拦截器机制,以及它的一系列拦截方法. 本次我们来学习Sring MVC的HandlerInter ...

  7. 在拦截器里放入参数 controller_程序员云旅游:10分钟带你走完SpringMVC里一次HTTP请求处理之路...

    代码写累了?工作没激情?还不来一场说走就走的旅行! 今天就由本大佬(请原谅我使用了略微夸张的修辞手法)亲自带队,来为大家导游,带领大家探秘神奇的SpringMVC世界,重走一次HTTP请求处理之路,本 ...

  8. spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

    转载:https://my.oschina.net/dengfuwei/blog/1795346 spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法  ...

  9. SpringMVC拦截器与Filter过滤器

    SpringMVC拦截器与Filter过滤器 SpringMVC拦截器与Filter过滤器 Spring MVC拦截器的定义 SpringMVC拦截器的配置 SpringMVC拦截器HandlerIn ...

最新文章

  1. go语言 rlock() defer runlock()_Go并发编程之美-读写锁
  2. 用指针的观点来深入理解dup和dup2的用法
  3. linux的json命令安装,linux 下强大的 JSON 解析命令 jq
  4. DYNP_VALUES_READ 获取屏幕动态值
  5. 2021前端高频面试题整理,附答案
  6. 如何成为一名有效的软件工程师
  7. 概率论公式,你值得拥有
  8. C++ 对象的内存布局(下)
  9. LINUX grep忽略排除某些目录、文件
  10. 有没有五金产品展开计算机软件,拆单软件功能介绍
  11. VGG-16网络结构
  12. windows 10 连接android手机助手,Win10手机助手怎么用?win10手机助手使用方法
  13. 关于 AWS 架构师认证考试
  14. C#大文件上传支持切片上传
  15. [合规性检查方法-Fitness3】基于足迹矩阵的拟合度评估方法
  16. 编写 Linux shell 脚本 踩坑记录
  17. 下列适合作为服务器操作系统的是,江苏专转本计算机真题 含答案
  18. intersect mysql,MySQL不支持INTERSECT和MINUS及其替代方法
  19. 2018.11.10 网页中使用Css+Html的圆形布局
  20. 9月第4周榜单丨飞瓜数据B站UP主排行榜(哔哩哔哩平台)发布!

热门文章

  1. OD的 CC断点,内存访问断点,硬件断点 解析
  2. cocos2d-x游戏实例(2)-主角根据输入移动
  3. 1_4 BuilderMode 建造者模式
  4. python获取文件夹下所有文件的两种方式
  5. 劫起|再谈Linux epoll惊群问题的原因和解决方案
  6. 忘掉Java并发,先听完这个故事...
  7. 这里有一份面筋请查收(五)
  8. 单调栈之Next Greater Number
  9. Java基础之equals和==的区别深入解析
  10. TensorFlow MNIST CNN LeNet5模型