欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring事務(wù)管理中的異?;貪L是什么

 更新時(shí)間:2023年02月09日 16:04:09   作者:小時(shí)候的陽光  
Spring中的代碼出現(xiàn)異常時(shí)會(huì)回滾這是大家都希望的情況,這時(shí)候可以用@Transactional這個(gè)注解放在你的方法上來進(jìn)行回滾,這時(shí)候有個(gè)問題就是事務(wù)回滾是不希望你在Controller進(jìn)行處理,而是在Service層來進(jìn)行處理

記錄總結(jié)Spring核心知識(shí)點(diǎn):事務(wù)使用與它的傳播機(jī)制

前言

這里不打算討論Spring底層源碼,只討論測(cè)試場(chǎng)景和總結(jié). 不斷整理讓大腦中的知識(shí)體系沉淀。

問題場(chǎng)景

某項(xiàng)目系統(tǒng)中,serviceA 中調(diào)用的 serviceB ,并且對(duì) serviceB 進(jìn)行 tryCache

@Service("testAService")
public class TestAServiceImpl implements TestAService {
    @Resource
    private TestAMapper testAMapper;
    @Resource
    private TestBService testBService;
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    public void saveTestA(TestA entity) {
        testAMapper.insertSelective(entity);
        try {
            testBService.saveTestB(new TestB());
        } catch (Exception e) {
            logger.error("調(diào)用B失敗", e);
        }
        // 模擬做其他的數(shù)據(jù)庫操作事情
        testAMapper.updateSelective(entity);
    }
}

testBService 中模擬拋出異常:

@Service("testBService")
public class TestBServiceImpl mplements TestBService {
    @Resource
    private TestBMapper testBMapper;
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
    @Override
    public void saveTestB(TestB entity) {
        testBMapper.insertSelective(entity);
        throw new RuntimeException("自定義異常");
    }
}

問 在Controller層中調(diào)用 TestAService.saveTestA() 會(huì)怎么樣?

    @Resource
    private TestAService testAService;
    @ApiOperation(value = "Spring事務(wù)嵌套測(cè)試")
    @GetMapping("springTransactionTest")
    public ResponseVO<NoBody> springTransactionTest() {
        testAService.saveTestA(new TestA());
        return ResponseVO.success();
    }

答案是:

testAService testBService 中的數(shù)據(jù)庫操作 全部回滾,并且拋出的錯(cuò)誤異常:

Transaction rolled back because it has been marked as rollback-only

原因是:

testBService.saveTestB 也增加了同樣的事務(wù)注解 @Transactional

且事務(wù)隔離機(jī)制為 “REQUIRED” ,因此 兩方法執(zhí)行期間為同一個(gè)數(shù)據(jù)庫事務(wù),被同一個(gè)Spring事務(wù)管理器所管理著。

由于最開始開啟事務(wù)者為 testAService.saveTestA,則真正執(zhí)行回滾操作在 saveTestA 方法中 (Spring 規(guī)定了只有新創(chuàng)建的事務(wù)才會(huì)真正進(jìn)行提交或回滾),

因此 saveTestB 方法中異常時(shí)只設(shè)置了當(dāng)前事務(wù)狀態(tài)為 RollbackOnly

org.springframework.jdbc.datasource.DataSourceTransactionManager#doSetRollbackOnly

雖然 saveTestA 中 tryCache 了 saveTestB 中的異常,企圖吃掉異常信息讓 saveTestA 中的事務(wù)正常提交,但是 saveTestB 里面已經(jīng)設(shè)置了 當(dāng)前事務(wù)狀態(tài)為 RollbackOnly, 出現(xiàn)了沖突矛盾!

因此事務(wù)全部回滾,并且拋出異常信息:

 Transaction rolled back because it has been marked as rollback-only

Spring 管理事務(wù)的原理

首先,事務(wù)一般是關(guān)系型數(shù)據(jù)庫中的概念,主要目的就是 保證一系列的增刪改 SQL操作 要么全部成功,要么全部回滾。

MySQL中的事務(wù)管理

在MySQL中采用SQL命令進(jìn)行事務(wù)管理:

  • START TRANSACTION 或 BEGIN 或 SET autocommit = 0 開啟事務(wù)
  • 執(zhí)行 CRUD
  • COMMIT 提交事務(wù)
  • ROLLBACK 回滾事務(wù)

這里重點(diǎn)說下 多條SQL在一個(gè)事務(wù)中,其中有部分SQL執(zhí)行失敗情況下,最終執(zhí)行結(jié)果是什么

> begin;
> insert_sql1 (insert into test1(id,name)value(1,'aaa')) ;
> insert_sql2 (insert into test2(id,name)value(1,'bbb')) ;
> commit/ rollback;

上面示意代碼,如果 insert_sql1 成功, insert_sql2 失敗時(shí),請(qǐng)問 insert_sql1 最終是否插入成功?

答案是:

首先事務(wù)不會(huì)馬上回滾, 其次如果 此時(shí)執(zhí)行commit則 insert_sql1 會(huì)插入成功 ,如果執(zhí)行rollback則insert_sql1 會(huì)回滾。

那一般事務(wù)什么時(shí)候自動(dòng)回滾或者自動(dòng)提交?這里記錄一下常見場(chǎng)景:

  • 如果事務(wù)執(zhí)行中出現(xiàn) DDL語句( alert create drop truncate等 ) 事務(wù)自動(dòng) commit;
  • 如果事務(wù)執(zhí)行中又開啟了一個(gè)事務(wù)(又出現(xiàn) begin; sql命令)事務(wù)自動(dòng) commit;
  • 如果執(zhí)行SQL的session 中途被關(guān)閉(SQL窗口關(guān)閉,服務(wù)器斷電等) 事務(wù)自動(dòng) rollback;

JDBC中的事務(wù)管理

JDBC中連接數(shù)據(jù)庫進(jìn)行事務(wù)管理:

  • 獲取連接 Connection con = DriverManager.getConnection()
  • con.setAutoCommit(true/false); 開啟事務(wù)
  • 執(zhí)行CRUD
  • con.commit() ; 提交事務(wù)
  • con.rollback(); 回滾事務(wù)
  • 關(guān)閉連接 conn.close();

JDBC 事務(wù)管理的本質(zhì)還是連接了數(shù)據(jù)庫執(zhí)行各類數(shù)據(jù)庫中開啟關(guān)閉事務(wù)的SQL命令

Spring中的事務(wù)管理

Spring通過自身AOP切面功能,代理各個(gè)業(yè)務(wù)方法調(diào)用 JDBC中的方法進(jìn)行開啟、關(guān)閉、提交、回滾事務(wù)等操作。

至于嵌套事務(wù)、各類傳播機(jī)制是如何實(shí)現(xiàn), 這里簡單總結(jié),雖然不能體現(xiàn)Spring 事務(wù)操作方面的強(qiáng)大,但可以很快有個(gè)大致理解。

Spring 通過 一個(gè)Map 存放了當(dāng)前數(shù)據(jù)庫連接對(duì)象,這是為了解決根據(jù)設(shè)定的傳播機(jī)制 ( propagation ) 決定是否要新開一個(gè)事務(wù),新開另外一個(gè)事務(wù)需要重新申請(qǐng)一個(gè)數(shù)據(jù)庫連接。

Spring 通過 數(shù)據(jù)庫事務(wù)中的 SAVEPOINT 保留點(diǎn)功能實(shí)現(xiàn) 嵌套事務(wù)的傳播機(jī)制。

這里記錄一下一個(gè)HTTP請(qǐng)求 從Controller層發(fā)起數(shù)據(jù)庫操作請(qǐng)求到回滾的log日志,用于加強(qiáng)理解:

    @ApiOperation(value = "事務(wù)回滾測(cè)試")
    @PostMapping("rollbackTest")
    public ResponseVO<NoBody> rollbackTest() {
        // 簡單模擬插入一條記錄
        testAService.saveTestA(new TestA());
        return ResponseVO.success();
    }

[http-nio-9902-exec-5] o.s.web.servlet.DispatcherServlet        : POST "/api/rollbackTest", parameters={}
[http-nio-9902-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to com.guzt.main.model.test.web.DbTestController#rollbackTest()
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Creating new transaction with name [com.sdjictec.wms.main.model.test.service.impl.TestAServiceImpl.saveTestA]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,-java.lang.Exception
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Acquired Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7fec11ca] for JDBC transaction
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Switching JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7fec11ca] to manual commit
[http-nio-9902-exec-5] c.s.w.m.m.t.d.T.insertSelective          : ==>  Preparing: INSERT INTO t_test_a ( ID,NAME ) VALUES(?,? )
[http-nio-9902-exec-5] c.s.w.m.m.t.d.T.insertSelective          : ==> Parameters: 1655001437939(String), p4xfy8(String)
[http-nio-9902-exec-5] c.s.w.m.m.t.d.T.insertSelective          : <==    Updates: 1
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Initiating transaction rollback
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Rolling back JDBC transaction on Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7fec11ca]
[http-nio-9902-exec-5] o.s.j.d.DataSourceTransactionManager     : Releasing JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@7fec11ca] after transaction
[http-nio-9902-exec-5] c.s.w.m.c.p.context.CurrentUserContext   : CurrentUserContext remove CurrentUserVO...
[http-nio-9902-exec-5] c.s.w.m.f.a.CurrentUserContextAspect     : CurrentUserContextAspect doAfterThrowing  CurrentUserContext.remove()...
[http-nio-9902-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Using @ExceptionHandler com.guzt.main.framework.exception.GlobalExceptionHandler#handleBusinessException(BusinessException)
[http-nio-9902-exec-5] c.s.w.m.f.e.GlobalExceptionHandler       : BusinessException -- errorCode:E5111 errorMsg:模擬數(shù)據(jù)庫操作異常,主鍵重復(fù)
[http-nio-9902-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json', given [*/*] and supported [application/json, application/json, application/*+json, application/json, application/*+json, application/cbor]
[http-nio-9902-exec-5] m.m.a.RequestResponseBodyMethodProcessor : Writing [ResponseVO(code=-1, message=模擬數(shù)據(jù)庫操作異常,主鍵重復(fù), data={"errorBody":"","bussinessCode":"E5111","extraMsg":""})]
[http-nio-9902-exec-5] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [com.guzt.starter.common.exception.BusinessException: errorCode=E5111, errorMsg=FAIL]
[http-nio-9902-exec-5] o.s.web.servlet.DispatcherServlet        : Completed 200 OK

主要的步驟:

Creating new transaction

DataSourceTransactionManager 根據(jù) TransactionDefinition 創(chuàng)建 TransactionStatus 對(duì)象,準(zhǔn)備開啟事務(wù)Acquired Connection for JDBC transaction

通過數(shù)據(jù)庫連接池 申領(lǐng)一個(gè)數(shù)據(jù)庫連接Switching JDBC Connection to manual commit

開啟事務(wù),底層是通過JDBC執(zhí)行 SET autocommit = 0; Initiating transaction rollback

準(zhǔn)備回滾事務(wù),修改 TransactionStatus 狀態(tài)為回滾Rolling back JDBC transaction

回滾事務(wù) ,底層是通過JDBC執(zhí)行 rollback; SET autocommit = 1;Releasing JDBC Connection

釋放數(shù)據(jù)庫連接,最后是關(guān)閉了數(shù)據(jù)庫連接,底層調(diào)用了 JDBC Connection.close()

Spring中的事務(wù)接口

上面日志中提到了 TransactionDefinition TransactionStatus 等接口,這里也順便總結(jié)一下Spring事務(wù)中重要的幾個(gè)接口。

接口含義說明
PlatformTransactionManager事務(wù)管理器各類數(shù)據(jù)庫操作框架自行實(shí)現(xiàn)該接口,例如 DataSourceTransactionManager(JDBC), JtaTransactionManager, HibernateTransactionManager
TransactionDefinition事務(wù)定義信息(隔離級(jí)別、傳播行為、超時(shí)、只讀、回滾規(guī)則) ,
一般在@Transactional 中指定這些屬性
如果是注解方式的事務(wù),Spring 通過 AnnotationTransactionAttributeSource.getTransactionAttribute(Method method, Class<?> targetClass) 創(chuàng)建,參數(shù)中的method就是開啟事務(wù)的業(yè)務(wù)方法
TransactionStatus事務(wù)運(yùn)行狀態(tài),包含是否已完成,是否只讀,是否有恢復(fù)點(diǎn),是否只回滾等事務(wù)管理器接口 PlatformTransactionManager 通過 getTransaction(TransactionDefinition definition) 方法來得到一個(gè)事務(wù)

至于具體功能流程,這里不討論,自行看源碼,多debug即可明白。

到底回滾還是不回滾

本次討論重點(diǎn)就是 Spring的事務(wù)管理中,遇到了程序異常到底會(huì)不會(huì)回滾?

簡明答案

執(zhí)行事務(wù)的方法如果感知到了異常則將回滾事務(wù)

什么是執(zhí)行事務(wù)的方法

一般方法上增加了 @Transactional 注解或 其他Spring事務(wù)支持的方式AOP代理了的方法

  @Transactional
   public void saveTestA(TestA entity) {
        業(yè)務(wù)代碼
   }

什么情況下異常被感知

被Spring事務(wù)AOP所代理的業(yè)務(wù)方法執(zhí)行時(shí)出現(xiàn)異常,且異常類在Spring事務(wù)回滾范圍內(nèi)的將被調(diào)用方法所感知。

默認(rèn)Spring只對(duì) unchecked Exception 進(jìn)行回滾,一般手動(dòng)設(shè)定全部異常(rollbackFor = Exception.class)

什么情況下異常不被感知

一般這是討論事務(wù)不生效的場(chǎng)景。

  • 方法訪問修飾符非public
  • 法拋出的異常不是spring的事務(wù)支持的異常
  • 被 Try-Cache 捕獲且不再向外拋出例如下面的場(chǎng)景代碼:
   @Transactional
   public void saveTestA(TestA entity) {
     try{
        業(yè)務(wù)代碼
     } catch (Exception e) {
         logger.error("內(nèi)部消化異常,不往外拋", e);
     }
   }

注解所在的類沒有被Spring 事務(wù)AOP代理

這種場(chǎng)景問題最隱蔽,一般需要有經(jīng)驗(yàn)或者多次debug才能發(fā)現(xiàn)

同一個(gè)類里面方法互相調(diào)用,一般建議采用 SpringUtil.getBean(this.getClass()).xxxx事務(wù)方法()

某些策略模式場(chǎng)景,需要將service對(duì)象放到一個(gè) Map<String, Service>中 ,如果是自行放置,則對(duì)象必須是 代理對(duì)象而非 this對(duì)象,建議采用 SpringUtil.getBean(this.getClass()) 對(duì)象。

參考代碼:

public class WxinOrderTypeServiceImpl implements OrderTypeService {
  @PostConstruct
  public void init() {
      ORDER_TYPE_SERVICE.put("orderTypeKey", SpringUtil.getBean(this.getClass());
  }
  @Transactional(rollbackFor = Exception.class)
  @Override
  public void saveOrder(Order order)
    logger.info("微信訂單");
  }
}

上面代碼意思是,將Spring代理的對(duì)象 WxinOrderTypeServiceImpl$Cjlibxxxx 放置到策略map ORDER_TYPE_SERVICE中去,如果用 this ( ORDER_TYPE_SERVICE.put("orderTypeKey",this)) 則事務(wù)不生效,因?yàn)閠his雖然也在Spring beanFactory中但沒有被事務(wù)AOP所代理,因此用this 會(huì)不生效。

備注: SpringUtil 其實(shí)就是實(shí)現(xiàn)了接口 ApplicationContextAware 獲得ApplicationContext,ApplicationContext 中有 getBean方法,當(dāng)然SpringBoot 可以在業(yè)務(wù)類里面直接注入 ApplicationContext

@Autowired
ApplicationContext applicationContext;

數(shù)據(jù)庫本身不支持事務(wù)

如果使用MySQL且存儲(chǔ)引擎是MyISAM,則事務(wù)是不起作用的

異常被感知后Spring做些什么

異常被感知后,Spring將會(huì)做回滾或更新TransactionStatus的狀態(tài)(doSetRollbackOnly).

一旦TransactionStatus 被打上了 RollbackOnly標(biāo)志后,那么不管中間的業(yè)務(wù)代碼是什么 都會(huì)拋出異常進(jìn)行全部事務(wù)回滾。

那么什么時(shí)候 不做回滾只更新 TransactionStatus 為 RollbackOnly?

參見文章一開始的業(yè)務(wù)代碼,同屬于一個(gè)事務(wù)中(Propagation.REQUIRED)的多個(gè)執(zhí)行事務(wù)方法(業(yè)務(wù)代碼中嵌套調(diào)用其他service方法),如果不是首次開啟事務(wù)的那個(gè)方法則都只會(huì)更新 TransactionStatus 為 RollbackOnly,事務(wù)的提交回滾由首次事務(wù)開啟的那個(gè)方法執(zhí)行

參見源碼 org.springframework.transaction.support.AbstractPlatformTransactionManager# processRollback

回滾程度是多少

事務(wù)回滾到哪一個(gè)程度,是全部嵌套調(diào)用的方法都回滾還是部分方法回滾,這里主要是由Spring的事務(wù)傳播機(jī)制功能控制。

分類行為說明回滾程度
加入當(dāng)前事務(wù)PROPAGATION_REQUIRED默認(rèn)方式,如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)全部回滾
加入當(dāng)前事務(wù)PROPAGATION_SUPPORTS如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行全部回滾
加入當(dāng)前事務(wù)PROPAGATION_MANDATORY如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常全部回滾
不加入當(dāng)前事務(wù)PROPAGATION_REQUIRES_NEW創(chuàng)建一個(gè)新的事務(wù),則把當(dāng)前事務(wù)掛起Java里面還是同一個(gè)線程,只新創(chuàng)建了另外一個(gè)數(shù)據(jù)庫連接開啟事務(wù),如果新事務(wù)回滾且程序異常被當(dāng)前事務(wù)方法感知,則當(dāng)前事務(wù)方法也同樣回滾
不加入當(dāng)前事務(wù)PROPAGATION_NOT_SUPPORTED以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起Java里面還是同一個(gè)線程 如果程序異常被當(dāng)前事務(wù)方法感知,則當(dāng)前事務(wù)方法也同樣回滾
不加入當(dāng)前事務(wù)PROPAGATION_NEVER以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常拋出異常,全部回滾
嵌套當(dāng)前事務(wù)PROPAGATION_NESTED如果當(dāng)前存在事務(wù),則創(chuàng)建一個(gè)事務(wù)嵌套在當(dāng)前事務(wù)中運(yùn)行;如果當(dāng)前沒有事務(wù),則該取值等價(jià)于 PROPAGATION_REQUIRED只回滾自己  底層采用數(shù)據(jù)庫SavePoint功能

到此這篇關(guān)于Spring事務(wù)管理中的異常回滾是什么的文章就介紹到這了,更多相關(guān)Spring異?;貪L內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring與Redis集成的正確方式流程詳解

    Spring與Redis集成的正確方式流程詳解

    這篇文章主要為大家介紹了Spring與Redis集成的正確方式流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Java設(shè)計(jì)模式之策略模式詳解和示例

    Java設(shè)計(jì)模式之策略模式詳解和示例

    這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式詳解和示例,策略模式就是一種行為可能會(huì)因?yàn)椴煌倪壿嬙斐啥鄠€(gè)算法,比如人吃飯,美國人吃飯用刀叉,中國吃飯用筷子,都是吃飯的行為但是使用的工具(算法)不一樣,需要的朋友可以參考下
    2024-01-01
  • java實(shí)現(xiàn)學(xué)生信息錄入界面

    java實(shí)現(xiàn)學(xué)生信息錄入界面

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生信息錄入界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Java中Iterable與Iterator用法

    詳解Java中Iterable與Iterator用法

    在本文中小編給大家分享了關(guān)于Java中Iterable與Iterator的用法知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2018-10-10
  • Elasticsearch學(xué)習(xí)之Terms?set?查詢

    Elasticsearch學(xué)習(xí)之Terms?set?查詢

    這篇文章主要為大家介紹了Elasticsearch學(xué)習(xí)Terms?set?查詢示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • IDEA的Project無法正常顯示的問題解決

    IDEA的Project無法正常顯示的問題解決

    本文主要介紹了IDEA的Project無法正常顯示的問題解決,文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • JAVA 數(shù)據(jù)結(jié)構(gòu)鏈表操作循環(huán)鏈表

    JAVA 數(shù)據(jù)結(jié)構(gòu)鏈表操作循環(huán)鏈表

    這篇文章主要介紹了JAVA 數(shù)據(jù)結(jié)構(gòu)鏈表操作循環(huán)鏈表的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • Java web Hibernate如何與數(shù)據(jù)庫鏈接

    Java web Hibernate如何與數(shù)據(jù)庫鏈接

    這篇文章主要介紹了Java web Hibernate如何與數(shù)據(jù)庫鏈接,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • SpringCloud如何創(chuàng)建一個(gè)服務(wù)提供者provider

    SpringCloud如何創(chuàng)建一個(gè)服務(wù)提供者provider

    這篇文章主要介紹了SpringCloud如何創(chuàng)建一個(gè)服務(wù)提供者provider,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • Spring Security實(shí)現(xiàn)自動(dòng)登陸功能示例

    Spring Security實(shí)現(xiàn)自動(dòng)登陸功能示例

    自動(dòng)登錄在很多網(wǎng)站和APP上都能用的到,解決了用戶每次輸入賬號(hào)密碼的麻煩。本文就使用Spring Security實(shí)現(xiàn)自動(dòng)登陸功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論