您的位置:首页 > 运维架构 > Apache

shiro 使用缓存时出现:java.io.NotSerializableException: org.apache.shiro.util.SimpleByteSource

2017-02-09 14:53 686 查看
在学习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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐