热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用shiro缓存用户身份信息的时候报:java.io.NotSerializableException:org.apache.shiro.util.SimpleByteSource

最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类

最近在使用shiro缓存用户的身份信息的时候,报了simpleByteSource不能序列化,跟进源码一看,原来这个类没有实现序列化的接口,但是我在缓存身份信息的实现又要用到这个类,解决方法:重写一个类,模仿着SimpleByteSoure这个类,写个自己的类。并且实现序列化接口即可·。

 1 package com.dzf.shiro;
 2 
 3 import org.apache.shiro.codec.Base64;
 4 import org.apache.shiro.codec.CodecSupport;
 5 import org.apache.shiro.codec.Hex;
 6 import org.apache.shiro.util.ByteSource;
 7 
 8 import java.io.Serializable;
 9 import java.util.Arrays;
10 
11 /**
12  * 

13 * 为了解决redis序列化的问题,SimpleByteSource没有实现序列化接口 14 * 在传入simpleAuthenticationInfo()的时候,缓存用户信息会出现序列化异常 15 *

16 * @author dingzf 17 * @date 2018/3/7 18 * @time 21:54 19 */ 20 public class ShiroByteSource implements ByteSource, Serializable { 21 private static final long serialVersiOnUID= -6814382603612799610L; 22 private volatile byte[] bytes; 23 private String cachedHex; 24 private String cachedBase64; 25 26 public ShiroByteSource() { 27 28 } 29 30 public ShiroByteSource(String string) { 31 this.bytes = CodecSupport.toBytes(string); 32 } 33 34 public void setBytes(byte[] bytes) { 35 this.bytes = bytes; 36 } 37 38 @Override 39 public byte[] getBytes() { 40 return this.bytes; 41 } 42 43 @Override 44 public String toHex() { 45 if ( this.cachedHex == null ) { 46 this.cachedHex = Hex.encodeToString(getBytes()); 47 } 48 return this.cachedHex; 49 } 50 51 @Override 52 public String toBase64() { 53 if ( this.cachedBase64 == null ) { 54 this.cachedBase64 = Base64.encodeToString(getBytes()); 55 } 56 return this.cachedBase64; 57 } 58 59 @Override 60 public boolean isEmpty() { 61 return this.bytes == null || this.bytes.length == 0; 62 } 63 64 @Override 65 public String toString() { 66 return toBase64(); 67 } 68 69 @Override 70 public int hashCode() { 71 if (this.bytes == null || this.bytes.length == 0) { 72 return 0; 73 } 74 return Arrays.hashCode(this.bytes); 75 } 76 77 @Override 78 public boolean equals(Object o) { 79 if (o == this) { 80 return true; 81 } 82 if (o instanceof ByteSource) { 83 ByteSource bs = (ByteSource) o; 84 return Arrays.equals(getBytes(), bs.getBytes()); 85 } 86 return false; 87 } 88 89 public static ByteSource of(String string) { 90 return new ShiroByteSource(string); 91 } 92 }

在自己的实现的realm里面调用如下:

1 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), new ShiroByteSource(user.getSalt()), getName());

以前的写法是:

1 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, user.getPassword(), new SimpleByteSource(user.getSalt()), getName());

然后就可以解决问题了。




推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • Java程序设计第4周学习总结及注释应用的开发笔记
    本文由编程笔记#小编为大家整理,主要介绍了201521123087《Java程序设计》第4周学习总结相关的知识,包括注释的应用和使用类的注释与方法的注释进行注释的方法,并在Eclipse中查看。摘要内容大约为150字,提供了一定的参考价值。 ... [详细]
  • 面向对象之3:封装的总结及实现方法
    本文总结了面向对象中封装的概念和好处,以及在Java中如何实现封装。封装是将过程和数据用一个外壳隐藏起来,只能通过提供的接口进行访问。适当的封装可以提高程序的理解性和维护性,增强程序的安全性。在Java中,封装可以通过将属性私有化并使用权限修饰符来实现,同时可以通过方法来访问属性并加入限制条件。 ... [详细]
author-avatar
D之phper
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有