0
点赞
收藏
分享

微信扫一扫

filter、interceptor、ControllerAdvice、Aspect

小猪肥 2022-03-18 阅读 21

文章目录

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 注解 (推荐)

@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

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 简单实现

@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 简单实现

注解说明
@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 条评论