当前位置: 首页 > news >正文

Filter过滤器,Interceptor拦截器,ControllerAdvice,Aspect切片

为什么80%的码农都做不了架构师?>>>   hot3.png

上图为在web项目中,在处理request请求时得处理顺序

在项目中我们改怎么使用呢?

 Filter过滤器

/**
 * Created by GAOMINGQIAN on 2017/12/10.
 *<pr>
 *     Filter只能获取到请求的request和response。获取不到其他的信息
 *     因为Filter属于J2EE的内容,不知道spring
 *      会拦截所有的请求
 *</pr>
 *
 */
//@Component
public class TimeFilter implements Filter {
    //初始化的时候调用
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("time filter init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("time filter start");
        long start=new Date().getTime();
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("time filter end:"+(new Date().getTime()-start));
        System.out.println("time filter finsh");
    }

    //销毁时调用
    @Override
    public void destroy() {
        System.out.println("time filter destory");
    }
}

上述内容中有一个@Component注解,当我们不想使用时或者更细的粒度拦截,需要在config类中进行注册

//配置一个过滤器
@Bean
public FilterRegistrationBean timeFilter() {
    //filter注册用的bean
    FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
    TimeFilter timeFilter = new TimeFilter();
    filterRegistrationBean.setFilter(timeFilter);
    List<String> urls = new ArrayList<>();
    urls.add("/*");
    //设置filter对那些请求有作用,这里设置的是对所有的请求都有作用
    filterRegistrationBean.setUrlPatterns(urls);
    return filterRegistrationBean;
}

Interceptor拦截器

/**
 * Created by GAOMINGQIAN on 2017/12/10.
 */
public class TimeInterceptor implements HandlerInterceptor {
    //该方法的返回值决定后续的方法是否执行(controller中的方法)
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        System.out.println("preHandle");
        //获取controller类名称
        System.out.println(((HandlerMethod) o).getBean().getClass().getName());
        //获取执行method的名字
        System.out.println(((HandlerMethod)o).getMethod().getName());
        httpServletRequest.setAttribute("startTime", new Date().getTime());
        return true;
    }

    //当controller抛出异常时,该方法不会被调用
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
        long start = (Long) httpServletRequest.getAttribute("startTime");
        System.out.println("time interceptor耗时" + (new Date().getTime() - start));
    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
        System.out.println("afterCompletion");
        long start = (Long) httpServletRequest.getAttribute("startTime");
        System.out.println("time interceptor耗时" + (new Date().getTime() - start));
        //当无异常的时候,e的值为null,有自定义异常时,也会为Null
        System.out.println(e);
    }
}

需要在配置类中声明才能使用,继承WebMvcConfigurerAdapter

//告诉spring这是一个配置类 
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{
  
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
       //注册当前的拦截器
       registry.addInterceptor(new TimeInterceptor());
    }
}

Aspect切片使用

/**
 * Created by GAOMINGQIAN on 2017/12/10.
 */
@Aspect
@Component
public class TimeAspect {
   //around中的execution中的内容代表对哪些方法进行拦截
    @Around("execution(* study.security.web.controller.UserController.*(..))")
    public Object handlerControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("time aspect start");
        //获取执行方法的参数
        Object[] args = pjp.getArgs();
        long start = new Date().getTime();
        //执行拦截的方法  result为拦截方法的返回值
        Object result = pjp.proceed();
        System.out.println("time aspect 耗时:" + (new Date().getTime() - start));
        return result;
    }
}

ControllerAdvice,主要用于异常处理的控制器

/**
 * Created by GAOMINGQIAN on 2017/12/10.
 */
@ControllerAdvice
public class ControllerHandlerException {
    @ExceptionHandler(UserNotExistException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public Map<String, Object> handleUserNotExistException(UserNotExistException ex) {
        Map<String, Object> result = new HashedMap();
        //放置需要响应的内容
        result.put("message",ex.getMessage());
        return result;
    }
}

优缺点介绍:

   Filter过滤器:可以拿到request,response但是拿不到处理方法的信息

   Interceptor拦截器:可以拿到request,response,也可以拿到处理方法的信息,但是拿不到处理方法参数的值

   Aspect切片:可以拿到处理方法的所有信息,但是拿不到request,response

 

转载于:https://my.oschina.net/gaomq/blog/1587576

相关文章:

  • php调用系统命令如何获得输出结果
  • 实现一个websocket服务器-实践篇
  • 分布式架构高可用架构篇_04_Keepalived+Nginx实现高可用Web负载均衡
  • ABP理论学习之缓存Caching
  • Linux GPIO控制方法
  • “双十二”:“交互+交易+交付”融合运营为王
  • 直接拿来用,最火的.NET开源项目
  • FAQ宝典之Rancher Server
  • Kali Linux渗透测试实战 2.2 操作系统指纹识别
  • Git:pull --rebase 和 merge --no-ff
  • 数据库模块(2天)(sql基础主键,外键,唯一索引)最重要连表查询
  • Neo4j embedded例子
  • win10编译caffe跑faster-rcnn(cuda7.5)
  • iOS计步器实例
  • 多线程
  • @angular/forms 源码解析之双向绑定
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • CSS 提示工具(Tooltip)
  • Javascript设计模式学习之Observer(观察者)模式
  • Java读取Properties文件的六种方法
  • MaxCompute访问TableStore(OTS) 数据
  • php ci框架整合银盛支付
  • Vue2.0 实现互斥
  • Web Storage相关
  • zookeeper系列(七)实战分布式命名服务
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 看域名解析域名安全对SEO的影响
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​学习一下,什么是预包装食品?​
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (TOJ2804)Even? Odd?
  • (ZT)一个美国文科博士的YardLife
  • (安卓)跳转应用市场APP详情页的方式
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (四)汇编语言——简单程序
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (新)网络工程师考点串讲与真题详解
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • ./configure,make,make install的作用(转)
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core中的去虚
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 反射的使用
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET文档生成工具ADB使用图文教程
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...