文章目录
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;
}
}