lt = JsonResult.fail("请先登录"); return result; } } // 从HttpServletRequest中获取请求信息,如URL、Method等 String requestURI = request.getRequestURI(); String requestMethod = request.getMethod(); allParams.add(requestURI); allParams.add(requestMethod); }else{ allParams.add(arg); } } try { // 调用目标方法 result = pjp.proceed(args); // 执行时间统计 long endTime = System.currentTimeMillis(); long executeTime = endTime - beginTime; logger.info("请求结束,方法:{},执行时间:{}ms", methodName, executeTime); } catch (Throwable e) { // 记录异常信息 logger.error("请求异常,方法:{},异常:{}", methodName, e.getMessage()); result = JsonResult.fail("服务器内部错误"); } finally { // 打印请求参数 logger.info("请求参数:{}", allParams); } return result; } // 判断方法是否需要登录 private boolean isLoginRequired(Method method){ LoginRequired loginRequired = method.getAnnotation(LoginRequired.class); return loginRequired != null; } // 判断用户是否登录 private boolean isLogin(HttpServletRequest request){ // 这里只是一个示例,实际应用中应该从session或者cookie中获取登录状态 String loginStatus = request.getParameter("loginStatus"); return "logged".equals(loginStatus); } }
在Spring Boot中,使用Spring AOP实现拦截器主要涉及到以下几个核心概念:
1. **AOP(面向切面编程)**:AOP是Spring框架的一个重要特性,它允许程序员定义“切面”,这些切面可以包含业务逻辑的“侧面”——例如日志、事务管理、安全检查等。AOP使得我们可以将这些关注点与主要的业务逻辑分离,从而提高代码的可读性和可维护性。
2. **@Aspect**:这是一个Spring AOP的注解,用于标记一个类作为切面。在上面的例子中,`ControllerInterceptor`类使用了这个注解,表明它是一个切面类,包含了拦截器的定义。
3. **@Pointcut**:这是定义拦截规则的地方。`@Pointcut`注解下的方法(在这个例子中是`controllerMethodPointcut()`)没有实际的业务逻辑,只是声明了要拦截的执行路径。这里的规则是拦截`com.xjj.web.controller`包下所有带有`@RequestMapping`注解的方法。
4. **@Around**:这个注解用于定义环绕通知,也就是拦截器的具体实现。环绕通知可以在方法调用前后执行自定义的逻辑。`Interceptor`方法使用了`@Around("controllerMethodPointcut()")`,这意味着它会在匹配`controllerMethodPointcut`规则的方法执行前后被调用。
5. **ProceedingJoinPoint**:在`Interceptor`方法中,`pjp`是一个`ProceedingJoinPoint`实例,它提供了访问被拦截方法的信息,比如方法签名、参数等,并且允许我们在适当的时候调用`proceed()`方法来执行原方法。
6. **@Before、@After、@AfterReturning、@AfterThrowing**:除了`@Around`,Spring AOP还提供了其他四种通知类型:`@Before`(前置通知,在目标方法之前执行)、`@After`(最终通知,在目标方法之后执行,无论是否抛出异常)、`@AfterReturning`(返回后通知,仅在方法正常返回时执行)和`@AfterThrowing`(异常后通知,仅在方法抛出异常时执行)。但在这个例子中,只使用了`@Around`。
7. **自定义注解**:在`isLoginRequired()`和`isLogin()`方法中,我们看到`LoginRequired`注解,这表明开发者可能定义了一个自定义注解,用于标记那些需要用户登录才能访问的方法。这体现了AOP的灵活性,可以轻松地添加新的业务规则。
总结起来,Spring Boot结合Spring AOP实现拦截器,主要是通过定义切面类,声明拦截规则(切点),然后编写环绕通知,以在方法执行前后插入自定义的行为,如记录日志、检查权限等。这种做法可以有效地解耦业务逻辑和这些通用的处理过程,使得代码更加模块化和易于维护。