今天项目启动后登录项目,突然爆出Unable to execute 'doFinal' with cipher instance错误。清除cookie登录测试,又不报错了,以前也见过类似问题,因为不影响使用,于是就忽略了,今天又遇到了,特研究一下。

  原来,项目中使用Shiro作为认证权限控制框架,问题就出在RememberMe功能的配置上。问题产生的原因是rememberMe的cookie在第二次打开页面后shiro无法解密。

项目配置

 @Bean
public RememberMeManager rememberMeManager() {
CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
//注入自定义cookie(主要是设置寿命, 默认的一年太长)
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
simpleCookie.setHttpOnly(true);
//设置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的构造方法中每次都会重新生成对称加密密钥,意味着每次重启程序都会重新生成一对加解密密钥。

  这就会导致了,第一次启动程序shiro使用A密钥加密了cookie,第二次启动程序shiro重新生成了密钥B,当用户访问页面时,shiro会用密钥B去解密上一次用密钥A加密的cookie,导致解密失败,导致报错,所以这不影响用户登录操作(rememberMe失效罢了),所以这种异常只会在程序重启(shiro清除session)第一次打开页面的时候出现。

  解决办法:手动设置对称加密秘钥。

 //手动设置对称加密秘钥,防止重启系统后系统生成新的随机秘钥,防止导致客户端cookie无效
rememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j3Y+R1aSn5BOlAA=="));

最新文章

  1. Oracle 11g静默安装软件+手工创建数据库
  2. Html的智能表单
  3. php和syslog
  4. SQLServer性能优化之 nolock,大幅提升数据库查询性能
  5. 修改memcached服务的端口号
  6. sass揭秘之变量(转载)
  7. 查找PHP的配置文件
  8. (转)对mysql explain讲的比较清楚的
  9. java日期转换
  10. 面向对象15.2String类-构造函数
  11. 操作系统,银行家算法模拟实现(Windows 环境 C++)
  12. linux系统日志查看
  13. jQuery实现的3个基础案例(仿QQ列表分组,二级联动下拉框,模拟员工信息管理系统)
  14. &lt;笔记&gt;Apache+PHP+MYSQL配置
  15. 微信小程序 JS 获取View 和 屏幕相关属性(高度、宽度等等)
  16. SpringBoot整合Mybatis完整详细版二:注册、登录、拦截器配置
  17. 【C++ 实验5 类和对象】
  18. Angularjs演示Service功能
  19. InstallShield2015制作安装包----------卸载前结束执行中的进程
  20. libxml2_ZC积累

热门文章

  1. Vue学习路线
  2. 3 Oracle 32位客户端安装及arcgis连接
  3. python API whoami
  4. 剑指offer——python【第31题】整数1出现的次数
  5. Exception occurred during processing request: id to load is required for loading
  6. 深入解析HashMap、HashTable
  7. python全栈开发 * 24 知识点汇总 * 180705
  8. tcpdf开发文档(中文翻译版)
  9. 解决url传中文参数问题
  10. Golang自定义包导入