- 关键字
- @controllerAdvice 中包含了@component组件,所以能被扫描到
- @aspect切面、@pointCut切入点、@before前置、@after后置、@around环绕、@afterthrowing异常抛出通知,切面修饰的类用组件注解
- 切点切面
- 切面修饰类,切入点修饰方法,通知修饰方法,切面由切点+通知
- 切点和通知一般传入五种参数
- 非环绕通知参数joinpoint、环绕通知参数proceedingjoinpoint、注解参数、返回值参数Object、throwable参数ex、execute对应的args里的参数
- 对请求流程进行控制
- ServletRequestAttributes ra= (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();//获取请求holder
HttpServletRequest request= ra.getRequest();//获取请求
HttpServletResponse response=ra.getResponse();//获取返回
String s= ra.getSessionId();//sessionid
Object o=ra.getSessionMutex();
HttpSession session= request.getSession();//获取session
String authType=request.getAuthType();
String sessionId=request.changeSessionId();
String contextPath=request.getContextPath();//路径
Cookie[] cookies=request.getCookies();//cookie
String method=request.getMethod();//获取切入点的方法
String pathInfo=request.getPathInfo();//路径
String queryString=request.getQueryString();
String remoteUser=request.getRemoteUser();//当前缓存的用户
String uri=request.getRequestURI();//路径
StringBuffer url=request.getRequestURL();//路径
String servletPath=request.getServletPath();//路径
Principal userPrincipal=request.getUserPrincipal();//授权用户的名称
ServletContext servletContext=request.getServletContext();
String serverName=request.getServerName();
Map<String,String[]> parameterMap=request.getParameterMap();//参数
Object[] args= joinPoint.getArgs();
String kind=joinPoint.getKind();
Signature signature= joinPoint.getSignature();//目标类上的成员
SourceLocation sourceLocation=joinPoint.getSourceLocation();
JoinPoint.StaticPart staticPart=joinPoint.getStaticPart();
Object targert=joinPoint.getTarget();//目标对象
- ServletRequestAttributes ra= (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();//获取请求holder
- 结合controller方法自定义注解做权限控制
- @After(value = "execution(public * cn.fanx.*.web.*Controller.*(..)) && @annotation(sysLog)")
- Aop与filter结合,因为执行顺序是由filter到aop拦截在到controller的,所以在进入controller之前过滤,filter粗粒度的过滤,aop细粒度过滤
- 增强器统一处理
- RequestBodyAdvice controller下只要有@requestBody的方法
- ResponseBodyAdvice controller下的方法有@responseBody的
- ExceptionAdvice 异常统一处理
- LogginAdvice 日志统一处理
- DelegatingIntroductionInterceptor引入增强,被实现并加@component注解
- @controllerAdvice对controller进行增强,如果是多模块,将增强器放入公用模块,其他模块引入公用模块,并在boot的入口处进行scan扫描公共包,才能让spring ioc扫描到controlleradvice注解
- 实现
- 实现requestBodyAdvice、responseBodyAdvice接口
- 异常处理方法上添加注解@ExceptionHandler,只要controller有异常就会被捕获到
- 作用范围 filter>interceptor>advice>aspect