国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

spring boot 使用AOP實(shí)現(xiàn)是否已登錄檢測(cè)

這篇具有很好參考價(jià)值的文章主要介紹了spring boot 使用AOP實(shí)現(xiàn)是否已登錄檢測(cè)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

? ? ? ? 前后端分離的開發(fā)中,用戶http請(qǐng)求應(yīng)用服務(wù)的接口時(shí), 如果要求檢測(cè)該用戶是否已登錄。可以實(shí)現(xiàn)的方法有多種, 本示例是通過(guò)aop 的方式實(shí)現(xiàn),簡(jiǎn)單有效。

? ? ? ? 約定:前端http的post?請(qǐng)求

export async function request(url,data) {
    const config = {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
    }
	//每個(gè)請(qǐng)求的參數(shù)要求附加sessionid, 該sessionid 是登錄時(shí)生成的
	const paramsData = Object.assign(data,{sessionid:globalData.sessionID || ''})
    config.body = JSON.stringify(paramsData)

    try {
      const res = await window.fetch(url, config)
      if(res.status!==200){
        return {
          status: res.status,
          data:{},
          headers: res.headers,
          url: res.url,
          statusText:res.statusText
        }
      }
    
      return {
        status: res.status,
        data:await res.json(),
        headers: res.headers,
        url: res.url,
      }
    
    } catch (err) {
      return {
        status: 404,
        data:{},
        headers: res.headers,
        url: res.url,
        statusText:'fetch error:'+err.toString()
      }
    }
  }
  

1、在pom.xml 引用

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

2、創(chuàng)建插入標(biāo)記


@Target({ElementType.METHOD}) // 只在對(duì)象方法上標(biāo)記
@Retention(RetentionPolicy.RUNTIME) //運(yùn)行時(shí)反射
public @interface Interceptor {
    String additionalMessage() default "";
}

3、實(shí)現(xiàn)切入類


@Aspect
@Component
@Slf4j
public class LoggingAspect {

    @Autowired
    public StringRedisTemplate redisTemplatelocate;

    private  <T> T getSessionID(Object postData,Class<T> clazz){
        return (T)postData;
    }

    @Around("@annotation(Interceptor)") //有標(biāo)記的地方將實(shí)現(xiàn)以下和切入
    public Object logExecutionTime(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        //獲取切入方法的參數(shù),就是前部請(qǐng)求的json數(shù)據(jù)
        Object[] args = proceedingJoinPoint.getArgs();

        //獲取其中的sessionid
        // requestBase 實(shí)體類只有一個(gè)參sessionid , 做為其它實(shí)體類的父類,用于接收接口上傳的參數(shù)。
        RequestBase requestBase=getSessionID(args[0],RequestBase.class);
        log.info("sessionid:{}",requestBase.getSessionid());

        //檢測(cè)該sessionid 是否存在(redis)
        if (requestBase.getSessionid()==null || !redisTemplatelocate.hasKey(requestBase.getSessionid())) {
            //用戶未登陸
            throw new Exception("用戶未登陸");
        }

        //獲取  request 和 response
        ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
        log.info("request:{}",servletRequestAttributes.getRequest());
        log.info("response:{}",servletRequestAttributes.getResponse());

        MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getMethod().getName();
        Instant startTime = Instant.now();
         //實(shí)行被切入的方法
        Object result = proceedingJoinPoint.proceed();
        
        String additionalMessage = methodSignature.getMethod().getAnnotation(Interceptor.class).additionalMessage();
        long elapsedTime = Duration.between(startTime, Instant.now()).toMillis();
        log.info("Class Name: {}, Method Name: {}, Additional Message: {}, Elapsed Time: {}ms",
                className, methodName, additionalMessage, elapsedTime);
        log.info("Result: {}", result);
        return result;
    }
}

4 建立api接口,在需要檢測(cè)的方法上加入@Interceptor 就完成切入的檢測(cè)。


@RestController
@Slf4j
public class ExampleController {

    @PostMapping("/t1")
    @Interceptor(additionalMessage = "要求檢測(cè)登錄")
    @ResponseBody
    public ResponseEntity<RequestBase> getData(@RequestBody DataRequest req) {
        try {
            return new ResponseEntity<>(req, HttpStatus.OK);
        } catch (Exception e) {
            return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
        }
    }
}

5 實(shí)體類


@Data
public class DataRequest extends RequestBase {
    private  String name;
}


@Data
public class RequestBase{
    private String sessionid;
}

? ?該方法只適用于少部分需要檢測(cè),而大部份不需要檢測(cè)的情況下,如果整個(gè)包都需要檢測(cè)的,利用execution方?法實(shí)現(xiàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-830392.html

 @Pointcut("execution(public * com.example.myapp..*.*(..))")

@Aspect
@Component
@Slf4j
public class LoginExecution {

    @Autowired
    public StringRedisTemplate redisTemplatelocate;

    private  <T> T getSessionID(Object postData,Class<T> clazz){
        return (T)postData;
    }

    //切入點(diǎn): com.aop.ttt 下的所有public 方法
    @Pointcut("execution(public * com.aop.ttt..*.*(..))")
    public void publicMethods() {}

    @Around("publicMethods()")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        //獲取切入方法的參數(shù),就是前部請(qǐng)求的json數(shù)據(jù)
        Object[] args = joinPoint.getArgs();

        //獲取其中的sessionid
        // requestBase 實(shí)體類只有一個(gè)參sessionid , 做為其它實(shí)體類的父類,用于接收接口上傳的參數(shù)。
        RequestBase requestBase=getSessionID(args[0],RequestBase.class);
        log.info("sessionid:{}",requestBase.getSessionid());

        //檢測(cè)該sessionid 是否存在(redis)
        if (requestBase.getSessionid()==null || !redisTemplatelocate.hasKey(requestBase.getSessionid())) {
            //用戶未登陸
            throw new Exception("用戶未登陸");
        }

        //獲取  request 和 response
        ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
        log.info("request:{}",servletRequestAttributes.getRequest());
        log.info("response:{}",servletRequestAttributes.getResponse());


        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getMethod().getName();
        Instant startTime = Instant.now();
        //實(shí)行被切入的方法
        Object result = joinPoint.proceed();


        long elapsedTime = Duration.between(startTime, Instant.now()).toMillis();
        log.info("Class Name: {}, Method Name: {}, Elapsed Time: {}ms",
                className, methodName, elapsedTime);
        log.info("Result: {}", result);
        return result;
    }
}

到了這里,關(guān)于spring boot 使用AOP實(shí)現(xiàn)是否已登錄檢測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JAVA:使用 Spring AOP 實(shí)現(xiàn)面向切面編程

    JAVA:使用 Spring AOP 實(shí)現(xiàn)面向切面編程

    1、簡(jiǎn)述 在現(xiàn)代的軟件開發(fā)中,面向切面編程(AOP)是一種重要的編程范式,它允許我們將橫切關(guān)注點(diǎn)(如日志記錄、性能監(jiān)控、事務(wù)管理等)從應(yīng)用程序的核心業(yè)務(wù)邏輯中分離出來(lái),以提高代碼的模塊化和可維護(hù)性。Spring 框架提供了強(qiáng)大的 AOP 支持,使得我們可以輕松地實(shí)

    2024年04月13日
    瀏覽(31)
  • spring boot 使用AOP+自定義注解+反射實(shí)現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對(duì)比數(shù)據(jù),并保存至日志表

    spring boot 使用AOP+自定義注解+反射實(shí)現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對(duì)比數(shù)據(jù),并保存至日志表

    使用FieldMeta自定義注解,看個(gè)人業(yè)務(wù)自行覺(jué)得是否需要重新定義實(shí)體 實(shí)現(xiàn)類 :通過(guò)該實(shí)現(xiàn)類獲取更新前后的數(shù)據(jù)。 該實(shí)現(xiàn)類的實(shí)現(xiàn)原理為:獲取入?yún)⒊鋈氲膇d值,獲取sqlSessionFactory,通過(guò)sqlSessionFactory獲取selectByPrimaryKey()該方法,執(zhí)行該方法可獲取id對(duì)應(yīng)數(shù)據(jù)更新操作前后的數(shù)

    2024年01月23日
    瀏覽(29)
  • Spring Boot 中如何使用 Spring Security OAuth2 來(lái)實(shí)現(xiàn)單點(diǎn)登錄

    Spring Boot 中如何使用 Spring Security OAuth2 來(lái)實(shí)現(xiàn)單點(diǎn)登錄

    在現(xiàn)代 Web 應(yīng)用程序中,單點(diǎn)登錄(Single Sign-On,簡(jiǎn)稱 SSO)是一個(gè)非常重要的功能。Spring Security OAuth2 是 Spring Security 框架的一個(gè)擴(kuò)展,它提供了一種簡(jiǎn)單的方式來(lái)實(shí)現(xiàn) SSO。在本文中,我們將介紹如何在 Spring Boot 應(yīng)用程序中使用 Spring Security OAuth2 來(lái)實(shí)現(xiàn)單點(diǎn)登錄。 在開始之前

    2024年02月06日
    瀏覽(24)
  • 在Spring boot中 使用JWT和過(guò)濾器實(shí)現(xiàn)登錄認(rèn)證

    在Spring boot中 使用JWT和過(guò)濾器實(shí)現(xiàn)登錄認(rèn)證

    在navicat中運(yùn)行如下sql,準(zhǔn)備一張user表 導(dǎo)入pom.xml坐標(biāo) 在工utils包下創(chuàng)建一個(gè)用于生成和解析JWT 令牌的工具類 在pojo包下創(chuàng)建user類 在mapper包下添加 UserMapper接口 在service包下添加 UserService類 在utils包下添加統(tǒng)一響應(yīng)結(jié)果封裝類 在controller包下添加LoginController類 這樣登錄獲取toke

    2024年02月06日
    瀏覽(18)
  • 網(wǎng)頁(yè)版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(二)前后端實(shí)現(xiàn)用戶的登錄和注冊(cè)功能【用戶模塊】

    網(wǎng)頁(yè)版Java(Spring/Spring Boot/Spring MVC)五子棋項(xiàng)目(二)前后端實(shí)現(xiàn)用戶的登錄和注冊(cè)功能【用戶模塊】

    1. 用戶id 2. 用戶名 3. 密碼 4. 天梯積分 5. 總場(chǎng)數(shù) 6. 獲勝場(chǎng)數(shù) 和數(shù)據(jù)庫(kù)的數(shù)據(jù)一一對(duì)應(yīng) 1. 連接數(shù)據(jù)庫(kù)(application.yml連接數(shù)據(jù)庫(kù)) 這個(gè)可以直接賦值代碼 2. 創(chuàng)建UserMapper的Java接口(interface UserMapper) 創(chuàng)建接口,在UserMapper.xml實(shí)現(xiàn) 在model中創(chuàng)建 需要實(shí)現(xiàn)@Mapper注釋 3. 創(chuàng)建UserMappe

    2024年02月13日
    瀏覽(24)
  • 基于Face++,使用Spring Boot+Elemnet-UI實(shí)現(xiàn)人臉識(shí)別登錄。

    基于Face++,使用Spring Boot+Elemnet-UI實(shí)現(xiàn)人臉識(shí)別登錄。

    上一篇文章只是封裝了人臉檢測(cè)的一些工具類,要實(shí)現(xiàn)刷臉登錄,我們首先得思考一個(gè)問(wèn)題,就是如何將我們的人臉和登錄賬戶信息進(jìn)行綁定,讓它通過(guò)人臉就能識(shí)別到當(dāng)前登錄的賬戶是誰(shuí)的賬戶。 這個(gè)問(wèn)題我們可以這樣解決,我瀏覽Face++的官網(wǎng)發(fā)現(xiàn)它還有人臉比對(duì)的一個(gè)

    2024年02月04日
    瀏覽(18)
  • 使用Spring Boot Security 實(shí)現(xiàn)多認(rèn)證 手機(jī)號(hào)登錄 微信掃碼登錄 微信掃碼注冊(cè)

    使用Spring Boot Security 實(shí)現(xiàn)多認(rèn)證 手機(jī)號(hào)登錄 微信掃碼登錄 微信掃碼注冊(cè)

    Spring Boot 3.x Spring Security 5.7 Spring Redis MyBatis plus 前端 Vue 公司 最近有個(gè)新項(xiàng)目 使用單點(diǎn)登錄 sso 百度了一圈 也沒(méi)怎么找到微信掃碼注冊(cè)的功能于是自己寫 需求就是 手機(jī) + 密碼登錄 微信掃碼登錄 微信掃碼注冊(cè) 微信二維碼 登錄 和注冊(cè)二合一 具體實(shí)現(xiàn) 稍后我會(huì)說(shuō) 本教程將指導(dǎo)

    2024年04月10日
    瀏覽(26)
  • spring-boot-starter-aop及其使用場(chǎng)景說(shuō)明

    spring-boot-starter-aop及其使用場(chǎng)景說(shuō)明

    如今,AOP(Aspect Oriented Programming)已經(jīng)不是什么嶄新的概念了,在經(jīng)歷了代碼生成、動(dòng)態(tài)代理、字節(jié)碼增強(qiáng)甚至靜態(tài)編譯等不同時(shí)代的洗禮之后,Java 平臺(tái)上的 AOP 方案基本上已經(jīng)以 SpringAOP 結(jié)合 AspectJ 的方式穩(wěn)固下來(lái)(雖然大家依然可以自己通過(guò)各種字節(jié)碼工具偶爾“打造一

    2024年02月03日
    瀏覽(26)
  • Spring Boot學(xué)習(xí)隨筆- 實(shí)現(xiàn)AOP(JoinPoint、ProceedingJoinPoint、自定義注解類實(shí)現(xiàn)切面)

    Spring Boot學(xué)習(xí)隨筆- 實(shí)現(xiàn)AOP(JoinPoint、ProceedingJoinPoint、自定義注解類實(shí)現(xiàn)切面)

    學(xué)習(xí)視頻:【編程不良人】2021年SpringBoot最新最全教程 問(wèn)題 現(xiàn)有業(yè)務(wù)層開發(fā)存在問(wèn)題 額外功能代碼存在大量冗余 每個(gè)方法都需要書寫一遍額外功能代碼不利于項(xiàng)目維護(hù) Spring中的AOP AOP:Aspect 切面 + Oriented 面向 Programmaing 面向切面編程 Aspect(切面) = Advice(通知) + Pointcut(

    2024年02月04日
    瀏覽(44)
  • spring boot整合第三方微信開發(fā)工具 weixin-java-miniapp 實(shí)現(xiàn)小程序微信登錄

    spring boot整合第三方微信開發(fā)工具 weixin-java-miniapp 實(shí)現(xiàn)小程序微信登錄

    有時(shí)候項(xiàng)目需要用到微信登錄或獲取用戶的手機(jī)號(hào)碼,weixin-java-miniapp是一個(gè)好用的第三方工具,不用我們自己寫httpcline調(diào)用。 導(dǎo)入jar包 添加一個(gè)resource.properties文件,寫上小程序的appid和secret 添加兩個(gè)配置文件 WxMaProperties.java WxMaConfiguration.java 如何使用 小程序給微信發(fā)送消息

    2024年02月16日
    瀏覽(94)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包