3

我有一个LoginPlaintext不能序列化的 Session-Scope Bean。

我有一个LoginMD5Salted必须可序列化的 Session-Scope Bean。

两者共享不可序列化的接口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;
}

如果会话被序列化:beanLoginPlaintext将不会被持久化。如果 Session 被反序列化,则所有其他值都可以很好地反序列化,但是反序列化器LoginPlaintext会抛出 NotSerializableException,好的。

如果会话被序列化:beanLoginMD5Salted将被很好地持久化。如果 Session 被反序列化,即使LoginMD5Salted没有任何问题,所有值都可以很好地反序列化。问题:

  1. 我如何才能防止仅针对班级的日志消息LoginPlaintext
  2. 如果无法通过重新激活对 LoginPlaintext 进行反序列化,是否会再次调用 AppConfig 的 loginData() 方法?
4

3 回答 3

1

如果不是必须不实现可序列化,则可以将其设为可序列化并覆盖 LoginPlaintext 的序列化/反序列化方法以始终序列化/反序列化 null。从来没有这样做过,但不应该太难做到。请参阅http://docs.oracle.com/javase/6/docs/api/java/io/Serializable.html

另一种解决方法是组成一个具有两种登录风格的范围会话 bean,并用瞬态标记你不想序列化的那个。

于 2013-05-09T10:23:50.253 回答
0

我会说你为什么要在 Session 中存储 LoginPlaintext 呢?loginData()将返回的值存储在仅可能可序列化的 Session 中是没有意义的。如果要存储 Session,则存储在 Session 中的任何内容都应该是可序列化的。所以要么不要存储Login在 Session 中,要么做Login瞬态,要么不允许LoginPlaintext实现Login.

于 2013-05-15T08:14:23.987 回答
0

您可以定义一个具有会话范围的 bean,而不是两个具有会话范围的 bean,该 bean 由两种风格组成,可序列化的和不可序列化的。

这可能是您的 PermissionBean。

将 java 关键字瞬态添加到 LoginPlaintext 属性。如果我没记错,这将被视为您实现了我给您的第一个答案,即它不会序列化您的敏感数据,并且在反序列化时将返回 null。

和上一个一样,我还没有真正做过,所以带着一粒盐

于 2013-05-10T11:08:36.673 回答