Filter、Interceptor、Aspect 区别及实现

Fliter 过滤器

请求在到达Controller之前进行与返回去之后 调用 入参为 reuqest,response,chian,过滤器获取不了具体调用哪一个类,哪一个方法。

实现:

1、继承 Filter 接口

import java.io.IOException;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.springframework.stereotype.Component;

//@Component
public class TimeFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("TimeFilter init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("TimeFilter in");
        long startTime = new Date().getTime();
        chain.doFilter(request, response);
        System.out.println("TimeFilter out 耗时:" + (new Date().getTime() - startTime));
    }

    @Override
    public void destroy() {
        System.out.println("TimeFilter destroy");
    }
}

2、声明:两种方式,一是在类前加入@Component ,不能指定拦截的路径;二是 对于SSM 在web.xml中进行声明,对于 SpringBoot 在webConfig中声明

web.xml

<filter>
    <filter-name>encodingFilterfilter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
    <init-param>
      <param-name>encodingparam-name>
      <param-value>UTF-8param-value>
    init-param>
filter>
<filter-mapping>
    <filter-name>encodingFilterfilter-name>
    <url-pattern>/*url-pattern>
filter-mapping>

SpringBoot:

package com.maple.web.config;

import java.util.ArrayList;
import java.util.List;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.maple.web.filter.TimeFilter;
import com.maple.web.interceptor.TimeInterceptor;

@Configuration
public class WebConfig{
    @Bean
    public FilterRegistrationBean timeFilter() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        registrationBean.setFilter(timeFilter);
        List url = new ArrayList<>();
        url.add("/*");
        registrationBean.setUrlPatterns(url);
        return registrationBean;
    }
}

Interceptor 拦截器

请求在到达Controller之前进行与返回去之后 调用 入参为 reuqest,response,handler,在过滤器之后调用,能够知道调用哪一个类,但是获取不了参数

1、继承HandlerInterceptor ,perHandler 在进入Controller前执行,若返回false则不进入Controller ,true进入Controller ,postHandler处理完Controller后进入此方法,若发生异常,则不进入postHandler。afterCompletion 都会进入此方法,无论是否发生异常都会进入。

package com.maple.web.interceptor;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * @author hzc
 *
 */
@Component
public class TimeInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle");

        System.out.println(((HandlerMethod)handler).getBean().getClass().getName());
        System.out.println(((HandlerMethod)handler).getMethod().getName());

        request.setAttribute("startTime", new Date().getTime());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");
        long startTime = (long) request.getAttribute("startTime");
        System.out.println("time interceptor 耗时: " + (new Date().getTime() - startTime));

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("afterCompletion");
        long startTime = (long) request.getAttribute("startTime");
        System.out.println("time interceptor 耗时: " + (new Date().getTime() - startTime));
        System.out.println("ex is " + ex);
    }

}

2、声明,在SSM中需要在spring配置文件中声明,在Springboot中在Config中声明。

SSM:

<mvc:interceptors>

        <mvc:interceptor>
            <mvc:mapping path="/**"/>

            <bean id="userinterceptor" class="org.sz.source.schedul.common.BaseOrgUserInterceptor">
                <property name="excludedUrls">
                   <list>
                       <value>/login.dovalue>
                   list>
                property>
            bean>
        mvc:interceptor>
mvc:interceptors>

SpringBoot:

package com.maple.web.config;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

    @Autowired
    private TimeInterceptor timeInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(timeInterceptor);
    }
}

Aspect 切面

使用切面,可前置增强,后置增强,环绕增强,在拦截器之后执行,可获取参数信息

1、编写切面方法类

import java.util.Date;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

/**
 * @author hzc
 *
 */
@Aspect
@Component
public class TimeAspect {

    @Around("execution(* com.maple.web.controller.UserController.*(..))")
    public Object handlerControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("time aspect start");
        Object[] args = pjp.getArgs(); // 获取参数
        for (Object arg : args) {
            System.out.println("arg is " + arg);
        }
        long startTime = new Date().getTime();
        Object object = pjp.proceed();
        System.out.println("time aspect 耗时: " + (new Date().getTime() - startTime));
        return object;
    }
}

Filter、Interceptor、Aspect的作用范围如下:

Filter、Interceptor、Aspect 区别及实现

Original: https://www.cnblogs.com/maple92/p/10781154.html
Author: Topze
Title: Filter、Interceptor、Aspect 区别及实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/582940/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Mysql多实例搭建部署

    【部署背景】 公司测试环境需求多个数据库实例,但是只分配一台MySQL机器,所以进行多实例部署。 【部署搭建】 创建软件包路径 mkdir /data/soft/package /…

    Linux 2023年6月8日
    088
  • 【小记】腾讯云 Linux 虚拟机如何正确修改 hosts 文件

    如果直接修改 /etc/hosts 文件,重启后设置会丢失还原,原因是腾讯云虚拟机默认使用了 Cloud-Init 进行初始化操作。 参见:https://cloud.tencen…

    Linux 2023年6月13日
    079
  • Redis 事务与锁

    基本操作 事务的基本操作 开启事务,设定事务的开启位置,此指令执行后,后续的所有指令均加入到事务中 multi 取消事务,终止当前事务的定义,发生在 multi 之后,exec 之…

    Linux 2023年5月28日
    072
  • 【Leetcode】120. 三角形最小路径和

    给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。 &#x76F8;&#x90BB;&#x7684;&a…

    Linux 2023年6月6日
    097
  • 目录遍历漏洞

    一.目录遍历漏洞原理目录遍历(路径遍历)是由于Web服务器或者Web应用程序对用户输入的文件名称的安全性验证不足而导致的一种安全漏洞,使得攻击者通过利用一些特殊字符就可以绕过服务器…

    Linux 2023年6月14日
    091
  • Docker-compose资源编排

    Docker-compose 1.简介 Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose将所管…

    Linux 2023年6月13日
    091
  • 40+倍提升,详解 JuiceFS 元数据备份恢复性能优化之路

    JuiceFS 支持多种元数据存储引擎,且各引擎内部的数据管理格式各有不同。为了便于管理,JuiceFS 自 0.15.2 版本提供了 dump 命令允许将所有元数据以统一格式写入…

    Linux 2023年6月14日
    097
  • Python 定义类时候加括号和不加括号的区别

    新式类与经典类 只有python2.x 中有新式类和经典类的说法,而python3.x 没有,因为其默认都是新式类 python2.x 中默认都是经典类,只有显式的继承了objec…

    Linux 2023年6月7日
    060
  • RabbitMQ知识简单理解

    官网链接:http://next.rabbitmq.com/getstarted.html 官网给出了每种工作模式的实例代码,可以参考其中的实现 一、RabbitMQ整体架构图 二…

    Linux 2023年6月14日
    0107
  • nginx安装配置步骤

    ​ yum install gcc gcc-c++ pcre pcre-devel openssl openssl-devel zlib zlib-devel -y [root@n…

    Linux 2023年6月11日
    076
  • DDR4 SDRAM -时序参数小册子

    如前所述,大神的原文链接如下:https://www.systemverilog.io/ddr4-timing-parameters-cheatsheet 参数 功能 ACTIVA…

    Linux 2023年6月7日
    088
  • 018 磁盘 IO 性能监控/压测工具(sar、iotop、fio、iostat)

    1 sar 命令查看当前磁盘 IO 读写 (1)sar 工具安装 (2)sar 查看磁盘IO读写情况 2 iotop 命令查看磁盘 IO 性能 (1)iotop 工具安装 (2)i…

    Linux 2023年5月27日
    081
  • BootstrapTreeView 实现懒加载和点击事件。

    BootstrapTreeView的js下载位置:https://github.com/patternfly/patternfly-bootstrap-treeview。(注意不是…

    Linux 2023年6月7日
    089
  • Linux—进程管理

    Linux 进程管理 1、进程管理介绍 1.1 什么是进程? 进程(Process)是计算机中的 程序关于某 数据集合上的一次 运行活动,是系统进行 资源分配和调度的 基本单位,是…

    Linux 2023年6月7日
    083
  • SQL87 最差是第几名(一)

    本题链接表结构如下所示。 +——-+——–+| grade | number |+——-+&#8…

    Linux 2023年6月13日
    072
  • 记一次centos挂载ceph存储的坑

    生产有两台服务器,准备用来跑工作流,执行的资源的是放在ceph存储集群中,第一步挂载ceph 执行命令: mount -t ceph xxx:xxx -o name=admin,s…

    Linux 2023年5月27日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球