日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shrio Unable to execute ‘doFinal‘ with cipher instance

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shrio Unable to execute ‘doFinal‘ with cipher instance 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天項(xiàng)目啟動后登錄項(xiàng)目,突然爆出Unable to execute ‘doFinal’ with cipher instance錯誤。清除cookie登錄測試,又不報(bào)錯了,以前也見過類似問題,因?yàn)椴挥绊懯褂?#xff0c;于是就忽略了,今天又遇到了,特研究一下。

原來,項(xiàng)目中使用Shiro作為認(rèn)證權(quán)限控制框架,問題就出在RememberMe功能的配置上。問題產(chǎn)生的原因是rememberMe的cookie在第二次打開頁面后shiro無法解密。

@Bean public RememberMeManager rememberMeManager() {CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();//注入自定義cookie(主要是設(shè)置壽命, 默認(rèn)的一年太長)SimpleCookie simpleCookie = new SimpleCookie("rememberMe");simpleCookie.setHttpOnly(true);//設(shè)置RememberMe的cookie有效期為7天simpleCookie.setMaxAge(604800);rememberMeManager.setCookie(simpleCookie); return rememberMeManager;}

框架源碼

public AbstractRememberMeManager() {this.serializer = new DefaultSerializer<PrincipalCollection>();AesCipherService cipherService = new AesCipherService();this.cipherService = cipherService;setCipherKey(cipherService.generateNewKey().getEncoded());}public void setCipherKey(byte[] cipherKey) {//Since this method should only be used in symmetric ciphers//(where the enc and dec keys are the same), set it on both:setEncryptionCipherKey(cipherKey);setDecryptionCipherKey(cipherKey);}

rememberMeManager繼承了AbstractRememberMeManager,然而AbstractRememberMeManager的構(gòu)造方法中每次都會重新生成對稱加密密鑰,意味著每次重啟程序都會重新生成一對加解密密鑰。

這就會導(dǎo)致了,第一次啟動程序shiro使用A密鑰加密了cookie,第二次啟動程序shiro重新生成了密鑰B,當(dāng)用戶訪問頁面時(shí),shiro會用密鑰B去解密上一次用密鑰A加密的cookie,導(dǎo)致解密失敗,導(dǎo)致報(bào)錯,所以這不影響用戶登錄操作(rememberMe失效罷了),所以這種異常只會在程序重啟(shiro清除session)第一次打開頁面的時(shí)候出現(xiàn)。

解決辦法:手動設(shè)置對稱加密秘鑰。

//手動設(shè)置對稱加密秘鑰,防止重啟系統(tǒng)后系統(tǒng)生成新的隨機(jī)秘鑰,防止導(dǎo)致客戶端cookie無效 rememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j3Y+R1aSn5BOlAA=="));

文章轉(zhuǎn)自

總結(jié)

以上是生活随笔為你收集整理的Shrio Unable to execute ‘doFinal‘ with cipher instance的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。