Day51(21)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\springboot-aop-quickstart

登录认证--拦截器Interceptor

image-20251130121926875

image-20251130122048923

image-20251130122152150

image-20251130124432636

令牌校验

image-20251130130810791

image-20251130131338342

image-20251130132229085

package com.itheima.Interceptor;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Slf4j
@Component
public class DemoIntercepter implements HandlerInterceptor {
    //目标资源方法运行之前运行,true放行,false不放行
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("prehandle...");
        return true;
    }

    //目标资源方法运行之前运行,true放行,false不放行
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("postHandle...");
    }

    //视图渲染完毕之后运行
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("afterCompletion...");
    }
}
package com.itheima.Interceptor;

import com.itheima.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

/**
 * 令牌校验的拦截器
 */
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.获取请求路径
        String requestURI = request.getRequestURI();
        //2.判断是否是login
//        if (requestURI.contains("/login")){
//            log.info("登录请求");
//            return true;
//        }
        //3.获取请求头中的token
        String token = request.getHeader("token");
        //4.判断token是否存在
        if (token==null||token.isEmpty()){
            log.info("令牌为空,响应401");
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        //5.校验
        try {
            JwtUtils.parseToken(token);
        } catch (Exception e) {
            log.info("令牌非法,响应401");
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return false;
        }
        return true;
    }
}
package com.itheima.config;

import com.itheima.Interceptor.DemoIntercepter;
import com.itheima.Interceptor.TokenInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * 配置类,底层封装了@component
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
//    @Autowired
//    private DemoIntercepter demoIntercepter;
    @Autowired
    private TokenInterceptor tokenInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenInterceptor)
                .addPathPatterns("/**")//拦截所有请求
                .excludePathPatterns("/login");//不拦截什么请求
    }
}

AOP

image-20251130133135004

image-20251130133116518

image-20251130133558160

package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect//标识当前不是一个普通类,是AOP类
@Component
public class RecordTimeAspect {

    @Around("execution(* com.itheima.service.impl.*.*(..))")
    public Object recordTime(ProceedingJoinPoint pjp) throws Throwable {
        //1.记录方法运行的开始时间
        long begin = System.currentTimeMillis();
        //2.执行原始的方法
        Object result = pjp.proceed();
        //3.记录方法运行的结束时间,记录耗时
        long end = System.currentTimeMillis();
        log.info("方法{}执行耗时:{}ms",pjp.getSignature(), end-begin);
        return result;
    }
}

image-20251130135602691

切入点一定是连接点,连接点不一定是接入点

image-20251130174428787

image-20251130174841492

实际调用的是代理对象的方法

image-20251130175728362

image-20251130180155723

package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Slf4j
@Aspect
@Component
public class MyAspect1 {
    @Pointcut("execution(* com.itheima.service.impl.*.*(..))")
    private void pt(){}
    //before是前置通知-目标方法运行之前
    @Before("pt()")
    public void before(){
        log.info("before...");
    }

    //环绕通知-目标方法执行之前和运行之后
    @Around("pt()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("around-before");
        Object proceed = pjp.proceed();
        log.info("around-after");
        return proceed;
    }

    //after是后置通知-目标方法运行之后
    @After("pt()")
    public void after(){
        log.info("after...");
    }

    //afterReturning是后置通知-目标方法运行之后,出现异常不会运行
    @AfterReturning("pt()")
    public void afterReturning(){
        log.info("afterReturning...");
    }

    //afterThrowing是后置通知-目标方法运行之后,出现异常才会运行
    @AfterThrowing("pt()")
    public void afterThrowing(){
        log.info("afterThrowing...");
    }
}

image-20251130183016742

image-20251130190924194

image-20251130191452584

image-20251130191858474

image-20251130193832284

package com.itheima.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@Order(2)
@Aspect
public class MyAspect5 {
    //前置通知
//    @Before("execution(public void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
//    @Before("execution( void com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
//    @Before("execution( void delete(java.lang.Integer))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.itheima.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.*.service.impl.DeptServiceImpl.delete(java.lang.Integer))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.*.service.impl.*.*(java.lang.Integer))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.*.service.impl.*.*(*))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.*.service.impl.DeptServiceImpl.del*(java.lang.Integer))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.itheima.service.impl.*.*e(*))")//包名.类名,强烈不建议省略
    //@Before("execution(* com..service.impl.DeptServiceImpl.*(..))")//包名.类名,强烈不建议省略
    //@Before("execution(* com.itheima.service.*.*(..))")//基于接口,所有的接口或者是类中的所有方法

    //匹配List与delete方法
    @Before("execution(* com.itheima.service.impl.DeptServiceImpl.list(..))||" +
                  "execution(* com.itheima.service.impl.DeptServiceImpl.delete(..))")
    public void before(){
        log.info("MyAspect4 -> before ...");
    }

}

image-20251130194029532

image-20251130194513652

@Before("@annotation(com.itheima.anno.LogOperation)")
public void before(){
    log.info("MyAspect4 -> before ...");
}
package com.itheima.anno;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogOperation {
}
posted @ 2025-11-30 19:47  David大胃  阅读(1)  评论(0)    收藏  举报