advice 和 拦截器_拦截机制中Aspect、ControllerAdvice、Interceptor、Fliter之间的区别详解...

本文详细介绍了Spring中的四种拦截方式:Filter、Interceptor、ControllerAdvice和Aspect,包括它们的适用场景、功能特点以及配置方法。Filter可获取Http原始请求和响应,但无法获取响应方法信息;Interceptor能获取请求、响应及响应方法信息,但无法获取方法参数;ControllerAdvice主要用于全局异常处理;Aspect则适用于公共方法的处理,能获取方法参数但无法获取原始Http请求。在实际项目中,应根据需求选择合适的拦截机制。
摘要由CSDN通过智能技术生成

在项目的开发中,在某些情况下,我们需要对客户端发出的请求进行拦截,常用的API拦截方式有Fliter,Interceptor,ControllerAdvice以及Aspect。

53ec69f1236e

上图是spring中的拦截机制,如果出现异常的话,异常的顺序是从里面到外面一步一步的进行处理,如果到了最外层都没有进行处理的话,就会由tomcat容器抛出异常。下面我将详细的解释这四个拦截方式的不同。因为只是演示就不是所有的使用了日志记录。这里相关的依赖自己可以去https://mvnrepository.com/下载,我就不一一添加了

先做一个总的总结吧

1.过滤器:Filter

:可以获得Http原始的请求和响应信息,但是拿不到响应方法的信息

2.拦截器:Interceptor

:可以获得Http原始的请求和响应信息,也拿得到响应方法的信息,但是拿不到方法响应中参数的值

3.ControllerAdvice(Controller增强,自spring3.2的时候推出):

主要是用于全局的异常拦截和处理,这里的异常可以使自定义异常也可以是JDK里面的异常

用于处理当数据库事务业务和预期不同的时候抛出封装后的异常,进行数据库事务回滚,并将异常的显示给用户

4.切片:Aspect

主要是进行公共方法的

可以拿得到方法响应中参数的值,但是拿不到原始的Http请求和相对应响应的方法

Filter(过滤器):

可以获得Http原始的请求和响应信息,但是拿不到响应方法的信息

filter是属于Servlet规范的,不属于Spring

springboot中的配置方法:

自定义一个Filterimport javax.servlet.*;

import java.io.IOException;

public class TimeFilter implements Filter {

/**Filter接口中的部分方法添加了default关键字,这样的方法就不是一定要重写*/

@Override

public void init(FilterConfig filterConfig)throws ServletException {

System.out.println("Time Filter init");

}

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {

System.out.println("time filter start");

/**这里说明一下,在JDK8以及之后的JDK版本中都不再建议使用new Date().getTime()这种方式来获得时间*/

long start = System.currentTimeMillis();

chain.doFilter(request,response);

System.out.println("time filter:"+(System.currentTimeMillis()-start));

System.out.println("time filter finish");

}

@Override

public void destroy() {

System.out.println("time filter destroy");

}

}

方式一:通过Bean注入的方式

注册Filter,springboot当中提供了FilterRegistrationBean类来注册Filterimport com.imooc.Filter.TimeFilter;

import com.imooc.Interceptor.TimeInterceptor;

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.WebMvcConfigurer;

import java.util.ArrayList;

import java.util.List;

@Configuration

public class WebConfigimplements WebMvcConfigurer {

/**WebMvcConfigurerAdapter在JDK8中这个类已经过时,我们直接继承这个类所继承的接口*/

@Bean

public FilterRegistrationBeantimeFilter(){

Fil

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值