在学习Shiro使用缓存时,出现:
java.io.NotSerializableException:org.apache.shiro.util.SimpleByteSource异常,开启debug会提示:
ERROR [authentication.data] - Disk Write of test failed: 错误。
出现这种情况是因为:SimpleByteSource没有是实现Serializable接口
解决办法:自定义一个类继承SimpleByteSource实现Serializable接口
当然也可以实现ByteSource接口和Serializable接口,但是实现ByteSource接口需要实现其方法,不方便。
自定义一个SimpleByteSource 类继承继承SimpleByteSource实现Serializable接口。
import java.io.Serializable; public class SimpleByteSource extends org.apache.shiro.util.SimpleByteSource implements Serializable{ private static final long serialVersionUID = 5528101080905698238L; public SimpleByteSource(byte[] bytes) { super(bytes); // TODO 自动生成的构造函数存根 } }
然后创建工具类ByteSourceUtils
import org.apache.shiro.util.ByteSource; public class ByteSourceUtils{ public static ByteSource bytes(byte[] bytes){ return new SimpleByteSource(bytes); } public static ByteSource bytes(String arg0){ return new SimpleByteSource(arg0.getBytes()); } }
在自定义realm的认证方法中:
@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String)token.getPrincipal(); User user = userService.getByUsername(username); if(user == null) { throw new UnknownAccountException();//没找到帐号 } if(Boolean.TRUE.equals(user.isLocked())) { throw new LockedAccountException(); //帐号锁定 } //交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user.getUsername(), //用户名 user.getPassword(), //密码 ByteSourceUtils.bytes(user.getSalt()),//salt getName() //realm name ); return authenticationInfo; }