在学习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;
}