我有一个不能序列化的会话范围Bean LoginPlaintext。
我有一个会话范围Bean LoginMD5Salted,必须是可序列化的。
两者都共享不可序列化的接口Login (因为LoginPlaintext必须不可序列化)!
我的AppConfig.java看起来是这样的:
public class AppConfig
...
Login loginData(ServletRequest request){
if(request.getParameter('useMD5')!=null){
return new LoginMD5Salted();
}
return new LoginPlaintext();
}
}我的PermissionBean .java看起来如下:
public class PermissionBean implements Serializable{
@Autowired
Login loginData;
}我的LoginPlaintext看起来是这样的:
public class LoginPlaintext implements Login{
String plainTextPassword;
....
}我的LoginMD5Salted看起来是这样的:
public class LoginMD5Salted implements Login, Serializable{
private static final long serialVersionUID = 2742674005972067910L;
// not sure Upcase/Lowcase
String MD5PasswordSalted;
}如果会话是序列化的: bean LoginPlaintext将不会被持久保存。如果会话是反序列化的,那么所有其他值都是反序列化的,但是LoginPlaintext的反序列化器会抛出一个NotSerializableException,好的。
如果会话是序列化的: bean LoginMD5Salted将被很好地保存。如果会话是反序列化的,那么所有值都可以很好地反序列化,即使是LoginMD5Salted也没有任何问题。问题:
LoginPlaintext的日志消息?发布于 2013-05-09 10:23:50
如果不是命令式不能实现可序列化,则只需将其序列化并覆盖LoginPlaintext的序列化/反序列化方法,以始终序列化/反序列化null。从来没有那样做过,但不应该太难做。请参阅http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html
另一种解决方法可以是组合一个范围会话bean,既具有登录风格,又可以标记您不想用瞬态序列化的会话bean。
发布于 2013-05-10 11:08:36
您可以定义一个具有会话作用域的bean,而不是两个具有会话作用域的bean,该会话作用域由两种类型(可序列化和不可序列化的)组成。
这可能是你的PermissionBean。
将java关键字瞬态添加到LoginPlaintext属性中。如果我没有错,这将被视为您实现了我给您的第一个答案,即它不会序列化您的敏感数据,并在反序列化时返回null。
和上一次一样,我还没有真正做过,所以你要用一点点盐来做
发布于 2013-05-15 08:14:23
我想说,您为什么要在会话中首先存储LoginPlaintext?让loginData()返回一个只可能是可序列化的值存储在会话中是没有意义的。如果要存储会话,则会话中存储的任何内容都应该是可序列化的。因此,要么不将Login存储在会话中,要么使Login处于瞬态状态,或者不允许LoginPlaintext实现Login。
https://stackoverflow.com/questions/16298789
复制相似问题