1,过滤器
什么是过滤器:可以拿到原始的http请求,拿不到请求控制器及控制器的方法
拦截web访问url地址
过滤器依赖于servlet容器,拦截器不依赖servlet容器
过滤器是基于函数回调
过滤器可以对几乎所有的请求起作用
2,拦截器
什么是拦截器:可以拿到你请求的控制器及方法,拿不到方法的参数信息
拦截以 .action结尾的url,拦截Action的访问。.action可以配置任意结尾
拦截器不依赖servlet容器,过滤器依赖于servlet容器
拦截器是基于java的反射机制,使用代理模式
拦截器只能对action起作用
拦截器可以访问action上下文
拦截器可以在拦截的前或后进行处理。
3,切面
什么是切面:可以拿到方法的参数信息,拿不到http的请求和响应的对象
只能拦截Spring管理Bean的访问
拦截器只能获取到类和方法的信息,但是对于方法中参数的值、和方法执行完毕后返回的数据,拦截器是得不到的,我们可以通过切面来获取。
@Aspect注解是切面注解类
@Pointcut切点定义
@Before是方法执行前调用
@After是方法执行后调用
@AfterReturning方法执行返回值调用
@Around : 执行顺序 @Around 》@Before》@Around 》@After
在切面中,可以获取到请求的参数,也可以获取到响应值,并且我们可以对参数和响应值做出一定修改并生效
-
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Arrays; @Component @Aspect public class TimeAspect { private Logger logger = LoggerFactory.getLogger(getClass()); @Pointcut("execution(* com.mright.security.demo.platform.controller.UserController.*(..))") public void user() { } @Before("user()") public void beforeControllerMethod(JoinPoint joinPoint) { logger.info("进入TimeAspect切面,执行之前"); } @Around("user()") public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable { logger.info("进入TimeAspect切面"); Object[] args = pjp.getArgs(); Arrays.asList(args).forEach(arg -> logger.info(arg.toString())); long start = System.currentTimeMillis(); Object obj = pjp.proceed(); logger.info(obj.toString()); logger.info("执行耗时 : " + (System.currentTimeMillis() - start) + "ms"); return obj; } @After("user()") public void afterControllerMethod(JoinPoint joinPoint) { logger.info("进入TimeAspect切面,执行之后"); } @AfterReturning(returning = "result", pointcut = "user()") public void doAfterReturnint(Object result) { logger.info("方法返回值:" + result.toString()); } }