请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

拦截器有几种写法?每种写法的应用场景都是固定的吗?

老师,不计LoginMemberFilter的话,我看到拦截器(以下两种写法都算是拦截器吧)至少都有两种写法了
写法1:

@Aspect
@Component
public class LogAspect {
    @Pointcut("execution(public * com.jiawa..*Controller.*(..))")
    public void controllerPointcut() {
    }

    @Before("controllerPointcut()")
    public void doBefore(JoinPoint joinPoint) {
    ...
    }
}

写法2:

@Component
public class MemberInterceptor implements HandlerInterceptor {
@Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    ...
    }
}

我的疑问是:写法1中的class LogAspect ,可以写成写法2的形式吗?反之亦然。
每种写法的应用场景都是固定的吗?比如说:写法1只能用于公共模块common,不适用于特定模块member.
谢谢老师解答!

正在回答

1回答

写法1是AOP,写法2是过滤器,过滤器只能用在对接口的拦截,AOP可以拦截各种类,具体是在@Pointcut里配置。要写成什么样,看你拦截了要做什么?比如加日志号,那肯定是在接口入口拦截,此时两种都可以;比如你想记录所有service的入参出参,那就只能用aop了;比如你想获取请求头、请求体的信息,那就只能用拦截器了。

0 回复 有任何疑惑可以回复我~
  • 提问者 慕神4535282 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2023-04-24 10:24:46
  • 提问者 慕神4535282 #2
    老师,您说:“比如你想获取请求头、请求体的信息,那就只能用拦截器了。” 对此我还有点疑问,在AOP中,不是也可以通过 ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getHeaders() 和  .getParameter() 和获得请求头和请求体的信息吗?
    回复 有任何疑惑可以回复我~ 2023-06-08 10:18:06
  • 甲蛙 回复 提问者 慕神4535282 #3
    哦,这个也可以,跟课程里的MemberContext一个道理,也是用线程本地变量来实现的。
    回复 有任何疑惑可以回复我~ 2023-06-16 09:44:03
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信