最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springAop實(shí)現(xiàn)權(quán)限管理數(shù)據(jù)校驗(yàn)操作日志的場(chǎng)景分析

 更新時(shí)間:2021年03月15日 10:55:26   作者:搞笑大爺  
這篇文章主要介紹了springAop實(shí)現(xiàn)權(quán)限管理數(shù)據(jù)校驗(yàn)操作日志的場(chǎng)景分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

作為一個(gè)寫(xiě)java的使用最多的輕量級(jí)框架莫過(guò)于spring,不管是老項(xiàng)目用到的springmvc,還是現(xiàn)在流行的springboot,都離不開(kāi)spring的一些操作,我在面試的時(shí)候問(wèn)的最多的spring的問(wèn)題就是我們?cè)谄匠5捻?xiàng)目中使用spring最多的有哪幾個(gè)點(diǎn)
在我看來(lái)無(wú)非就兩個(gè)

  1. spring的bean管理,說(shuō)的高大上一點(diǎn)就是spring的ioc,di
  2. spring的AOP

spring是一個(gè)很強(qiáng)大的輕量級(jí)框架,功能遠(yuǎn)不止這兩點(diǎn),但是我們用的最多的就是這兩點(diǎn)。

spring bean 管理

想我們常用的 @Controller @Service @Component 等等都是將我們的bean交給spring管理,我們?cè)讷@取bean的時(shí)候就直接通過(guò) @Resource 就可以獲取,當(dāng)然@Resource 不是spring的,@Autowired 才是spring的,這樣我們可以很方便的管理我們的各種bean,使用起來(lái)也很方便,不用到處new

springAOP

這個(gè)應(yīng)該是spring面試最常問(wèn)道的問(wèn)題了,我面試的時(shí)候一般不直接問(wèn),我會(huì)說(shuō)一個(gè)場(chǎng)景,如果面試者使用過(guò)aop立馬就可以回答出來(lái)。
有這么一個(gè)場(chǎng)景,一個(gè)系統(tǒng)已經(jīng)開(kāi)發(fā)完成了,而且已經(jīng)上線運(yùn)行了一段時(shí)間,很穩(wěn)定了,現(xiàn)在要加一個(gè)功能,就是想收集用戶(hù)的操作日志,操作日志要比較細(xì)致,比如 某某人,在哪個(gè)時(shí)間點(diǎn),操作了哪個(gè)模塊,請(qǐng)求的參數(shù)是什么樣子的,操作結(jié)果如何,等一些比較細(xì)致的操作。很多面試者第一時(shí)間想到的就是使用過(guò)濾器,試想一下,過(guò)濾器真的能做到記錄這么細(xì)致的內(nèi)容嗎?有的可能會(huì)想到,我們定義一個(gè)公共的方法,所有需要記錄日志的地方都去調(diào)用這個(gè)方法,等等。其實(shí)這些都不好,最好的當(dāng)然是使用aop,使用aop侵入性最小,系統(tǒng)已經(jīng)穩(wěn)定運(yùn)行了,不能去動(dòng)之前的代碼,我們做個(gè)aop就可以了,對(duì)原來(lái)的代碼幾乎0侵入,對(duì)系統(tǒng)影響最小。
那aop實(shí)現(xiàn)的方式有哪幾種呢?aop實(shí)現(xiàn)的步驟又是怎么樣的呢?aop還能做些什么呢?這些問(wèn)題如果在實(shí)際項(xiàng)目中使用過(guò),一定能回答出來(lái),如果沒(méi)有使用過(guò),估計(jì)有點(diǎn)難回答,這些都是項(xiàng)目框架的東西,很多公司的項(xiàng)目這一塊已經(jīng)封裝好了,很多人直接一直在用,但是沒(méi)有去查看源碼,就不知道具體的實(shí)現(xiàn),實(shí)現(xiàn)起來(lái)其實(shí)也很簡(jiǎn)單。

接下來(lái)我們就以一個(gè)小例子來(lái)說(shuō)明下如何使用aop
aop總結(jié)起來(lái)最常用的就兩種方式
1、采用聲明的方式來(lái)實(shí)現(xiàn)(基于XML) 胡子眉毛一把抓,哈哈
2、是采用注解的方式來(lái)實(shí)現(xiàn)(基于AspectJ)精準(zhǔn)定位
我習(xí)慣使用注解的方式,更加靈活,使用起來(lái)也方便,接下來(lái)就以注解的方式來(lái)講下如何使用aop來(lái)做權(quán)限校驗(yàn),數(shù)據(jù)校驗(yàn),操作日志記錄

申明切面

我們使用springaop,首先要將定義的類(lèi)交給spring管理,然后使用aspectj 定義切面,我們要額外引入
aspectj

 <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.8.9</version>
</dependency>
@Component
@Aspect
public class OperationInterceptor {

}

定義切點(diǎn)

我們采用注解的方式,那么我們首先要申明一個(gè)注解

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface GlobalInterceptor {

  /**
   * 權(quán)限編碼
   */
  PermissionCodeEnum permissionCode();


  /**
   * 操作模塊
   *
   * @return
   */
  OperModuleEnum opObject() default OperModuleEnum.NO_OBJECT;

  /**
   * 操作描述
   *
   * @return
   */
  String opDescription() default "";

}

然后在我們的切面中定義切點(diǎn)

@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
}

定義通知類(lèi)型

我們要輸入還想要輸出,那么我們就要將目標(biāo)方法包圍,所以使用around

@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
  	@Around("opMethods()")
  public Object doMethod(ProceedingJoinPoint point) throws BusinessException {
   //TODO 業(yè)務(wù)代碼
   return null;
	}
}

這樣一個(gè)完整的切面就定義好了

使用切面

在我們的controller中直接使用,我們拿一個(gè)登錄來(lái)講

@RequestMapping("/login")
@GlobalInterceptor(permissionCode = PermissionCodeEnum.NO_PERMISSION, opObject = OperModuleEnum.OBJECT_LOGIN, opDescription = "登錄賬號(hào):#{#param1}")
  public AjaxResponseVO login(HttpSession session, @VerifyParam(required = true) String account, @VerifyParam(required = true) String password,@VerifyParam(required = true) String checkCode){

}

我們要傳入 切面注解需要的參數(shù)
permissionCode 權(quán)限編碼,我這里定義的是一個(gè)枚舉,類(lèi)型自己根據(jù)實(shí)際情況定義
opObject 操作模塊
opDescription 操作描述,這里簡(jiǎn)單的組織下描述文字,參數(shù)的地方使用占位符,到時(shí)候根據(jù)占位符index獲取具體的參數(shù)

這樣我們?cè)谇忻嬷芯涂梢阅玫竭@些參數(shù)

@Component
@Aspect
public class OperationInterceptor {

	@Pointcut("@annotation(com.xx.xx.GlobalInterceptor)")
	private void opMethods() {
  }
  
  	@Around("opMethods()")
  public Object doMethod(ProceedingJoinPoint point) throws BusinessException {
   Object obj = null;
    try {
      /**
       * 獲取登錄信息
       */
      SessionUserDto sessionUserDto = getSessionUser();
      /**
       * 獲取目標(biāo)切點(diǎn)
       */
      Object target = point.getTarget();
      /**
       * 獲取參數(shù)
       */
      Object[] arguments = point.getArgs();
      /**
       * 獲取方法名
       */
      String method = point.getSignature().getName();
      /**
       * 獲取參數(shù)類(lèi)型
       */
      Class<?>[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();
      /**
       * 獲取具體的方法
       */
      Method m = target.getClass().getMethod(method, parameterTypes);
      
      GlobalInterceptor interceptor = m.getAnnotation(GlobalInterceptor.class);
      if (null == interceptor) {
        return obj;
      }
      /**
       * 校驗(yàn)權(quán)限
       */
      if (sessionUserDto != null) {
        validatePermission(interceptor, sessionUserDto);
      }

      /**
       * 校驗(yàn)參數(shù)
       */
      validateParams(interceptor, m, arguments);

      /**
       * 獲取描述信息,這里在執(zhí)行方法之前組織好描述信息,當(dāng)參數(shù)是傳值引用時(shí) 執(zhí)行具體方法后,會(huì)改變?cè)紖?shù)對(duì)象值
       */
      String description = getDescription(arguments, interceptor.opDescription());
      /**
       * 執(zhí)行操作
       */
      obj = point.proceed();

      /**
       * 記錄日志
       */
      wirteLog(obj, description, interceptor, sessionUserDto);

    } catch (BusinessException e) {
      logger.error("全局?jǐn)r截器異常", e);
      throw e;
    } catch (Exception e) {
      logger.error("全局?jǐn)r截器異常", e);
    } catch (Throwable e) {
      logger.error("全局?jǐn)r截器異常", e);
    }
    return obj;
	}
}

這里只貼出了部分代碼,完整的代碼可以到這里獲取

總結(jié)

回到最開(kāi)始的問(wèn)題,這樣我們實(shí)現(xiàn)了一個(gè)對(duì)原有系統(tǒng)侵入極小,然后又實(shí)現(xiàn)了操作日志的解決方案。 我們使用spring的aop非常簡(jiǎn)單,我們使用aop結(jié)合反射,可以做很多事情。aop對(duì)代碼的侵入非常小,不需要?jiǎng)釉瓉?lái)的代碼,只需要在原有的方法上加一個(gè)注解就可以完成對(duì)系統(tǒng)的改造,加權(quán)限,加日志 等等一系列操作。

到此這篇關(guān)于springAop實(shí)現(xiàn)權(quán)限管理數(shù)據(jù)校驗(yàn)操作日志的場(chǎng)景分析的文章就介紹到這了,更多相關(guān)springAop權(quán)限管理數(shù)據(jù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Maven配置多倉(cāng)庫(kù)無(wú)效的解決

    Maven配置多倉(cāng)庫(kù)無(wú)效的解決

    在項(xiàng)目中使用Maven管理jar包依賴(lài)往往會(huì)出現(xiàn)很多問(wèn)題,所以這時(shí)候就需要配置Maven多倉(cāng)庫(kù),本文介紹了如何配置以及問(wèn)題的解決
    2021-05-05
  • 如何使用XPath提取xml文檔數(shù)據(jù)

    如何使用XPath提取xml文檔數(shù)據(jù)

    這篇文章主要介紹了如何使用XPath提取xml文檔數(shù)據(jù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 詳細(xì)了解MyBatis的異常處理機(jī)制

    詳細(xì)了解MyBatis的異常處理機(jī)制

    本文將對(duì)MyBatis的異常體系以及異常使用進(jìn)行學(xué)習(xí),MyBatis版本是3.5.6,作為一款成熟的ORM框架,MyBatis有自己一套成熟的異常處理體系,,需要的朋友可以參考下
    2023-06-06
  • Java中Set集合的基本使用方法舉例

    Java中Set集合的基本使用方法舉例

    在Java中可以使用不同的實(shí)現(xiàn)類(lèi)來(lái)創(chuàng)建和初始化Set集合,下面這篇文章主要給大家介紹了關(guān)于Java中Set集合的基本使用方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • 關(guān)于List、Map、Stream初始化方式

    關(guān)于List、Map、Stream初始化方式

    這篇文章主要介紹了關(guān)于List、Map、Stream初始化方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java獲取版本號(hào)及字節(jié)碼編譯版本方法示例

    java獲取版本號(hào)及字節(jié)碼編譯版本方法示例

    這篇文章主要給大家介紹了關(guān)于java獲得版本號(hào)及字節(jié)碼編譯版本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • Spring容器添加組件方式實(shí)現(xiàn)

    Spring容器添加組件方式實(shí)現(xiàn)

    這篇文章主要介紹了Spring容器添加組件方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Java中ArrayBlockingQueue和LinkedBlockingQueue

    Java中ArrayBlockingQueue和LinkedBlockingQueue

    這篇文章主要介紹了Java中ArrayBlockingQueue和LinkedBlockingQueue,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-09-09
  • 劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組

    劍指Offer之Java算法習(xí)題精講鏈表與字符串及數(shù)組

    跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過(guò)之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢(xún)的操作方法

    Mybatis Criteria使用and和or進(jìn)行聯(lián)合條件查詢(xún)的操作方法

    這篇文章主要介紹了Mybatis Criteria的and和or進(jìn)行聯(lián)合條件查詢(xún)的方法,本文通過(guò)例子給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10

最新評(píng)論

滦南县| 瑞金市| 富顺县| 江北区| 兴宁市| 宜丰县| 肇州县| 海兴县| 盐边县| 龙泉市| 鄯善县| 芮城县| 高州市| 山西省| 蓝山县| 扶余县| 阳春市| 宜城市| 清涧县| 郯城县| 萝北县| 富川| 小金县| 平江县| 徐州市| 南川市| 环江| 溧阳市| 南乐县| 同心县| 天门市| 得荣县| 临沧市| 尼玛县| 石棉县| 乡宁县| 遵化市| 泽州县| 德令哈市| 新丰县| 淅川县|