filter、interceptor、ControllerAdvice、Aspect

filter:servlet 中的过滤器

Interceptor:springMVC中的拦截器

ControllerAdvice: spring3.2提供的Cotroller增强器

​ 多配合@ExceptionHandler使用做异常拦截

Aspect:切面处理

执行顺序

  1. filter
  2. interceptor
  3. controllerAdvice
  4. aspect
  5. controller

filter - 初始化 init -过滤之前 doFilter

interceptor -preHandel

controllerAdcie -捕获有没有异常 产生

aspect - 切如方法,执行逻辑

controller - 主业务逻辑

filter 过滤器 简单实现

实现 javax.servlet.Filter

public class MyFilter implements Filter{
  
  public void init(FilterConfig filterConfig)throw ServletException{
    //过滤器初始化...业务逻辑
  }
  public void doFilter(....){
    //开始执行过滤器...业务逻辑
    
    //放行
    filterChain.doFilter(req,resp);
    
    //过滤器执行后 ...业务逻辑
  }
  
  public void destroy(){
    //过滤器销毁 ...业务逻辑
  }
}

配置拦截器

通过@WebFilter 注解 (推荐)

  1. 成为spring 中的bean
  2. 设置 urlPatterns 匹配拦截请求路径
@Component
@WebFilter(urlPatterns = {"/*"})
public class MyFilter implements Filter{}

filterRegistrationBean 注册拦截器

@Configuration
public class WebConfig{
  @Bean
  public FilterRegistrationBean MyFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        TimeFilter timeFilter = new TimeFilter();
        filterRegistrationBean.setFilter(timeFilter);
    
    		//添加拦截路径
        List<String> urlList = new ArrayList<>();
        urlList.add("/*");

        filterRegistrationBean.setUrlPatterns(urlList);
        return filterRegistrationBean;
  }
}

Interceptor 拦截器简单实现

继承 HandlerInterceptor

自定义拦截器,编写业务逻辑

preHandle 在方法到达controller之前执行

postHandle 在拦截方法没有抛出异常,时才会执行

afterCompletion 一定会执行的部分

public class UserTokenInterceptor extends BaseInterceptor implements HandlerInterceptor {

    // 请求 到达controller 之前
    @Override
    public boolean preHandle(...) {
        return //业务逻辑 ;
    }

    //请求 到达controller 渲染视图之前
    @Override
    public void postHandle(..){}

 		//一定会执行的部分
    @Override
    public void afterCompletion(..) }
}

继承 WebMvcConfigurer

注册拦截器,设置需要拦截的路径

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

  	//注入拦截器
    @Bean
    public UserTokenInterceptor userTokenInterceptor(){return new UserTokenInterceptor();}

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //注册拦截器
        registry.addInterceptor(userTokenInterceptor())
                //拦截路径
                .addPathPatterns("/user/getAccountInfo")
                .addPathPatterns("/user/updateUserInfo");
      
      //配置第二个拦截器
      registry.addInterceptor( Interceptor() )...
    }
}

ControllerAdvice 简单实现

@ControllerAdvice,是Spring3.2提供的新注解,它是一个Controller增强器,可对controller中被 @RequestMapping注解的方法加一些逻辑处理。最常用的就是异常处理
需要配合@ExceptionHandler使用。
当将异常抛到controller时,可以对异常进行统一处理,规定返回的json格式或是跳转到一个错误页面

@ExcetpinHandler

//被spring 管理
@ControllerAdvice
public class GraceExceptionHandler {

    //拦截自定义异常
    @ExceptionHandler(MyException.class)
    //json类型返回
    @ResponseBody
    public RJSON returnException(MyException e) {
        e.printStackTrace();
        return RJSON.exception(e.getRepEnum());
    }
    
    //捕获其他类异常继续处理. 例如系统抛出的异常
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    @ResponseBody
    public RJSON returnMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        e.printStackTrace();
        return RJSON.errorCustom(ResponseStatusEnum.FILE_MAX_SIZE_ERROR);
    }
}

Aspect 简单实现

@EnableAspectJAutoProxy 开启AOP自动代理

springboot 中组合了此注解,不需要在添加

注解说明
@Before前置通知
@AfterReturning后置通知
@AfterThrowing异常通知
@After最终通知
@Around环绕通知
@Pointcut配置切入点表达式
  • * :拦截的返回类型
  • … :当前包下面的子包
  • * 任何类 .* 所有方法 (…)任意参数
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
 * 监控所有的 service
 */
@Aspect
@Component
public class ServiceLogAspect {
    /*
        切面表达式说明
        execution 切面表达式主体
        * 返回类型   * 代表所有类型
        路径 * 任意包
        .. 当前包和子包下的所有类方法
        * 任意类名
        *(..)  任意方法名,任意参数
     */
    @Around("execution(* com.lfweixiao.*.service.impl..*.*(..))")
    public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable {
       // 方法前逻辑
        Object result = joinPoint.proceed();
				//方法后逻辑
        return result;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值