首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring的DI不是瞬态的,也不是可串行化的,而是记录NSE

Spring的DI不是瞬态的,也不是可串行化的,而是记录NSE
EN

Stack Overflow用户
提问于 2013-04-30 11:28:14
回答 3查看 748关注 0票数 3

我有一个不能序列化的会话范围Bean LoginPlaintext

我有一个会话范围Bean LoginMD5Salted,必须是可序列化的。

两者都共享不可序列化的接口Login (因为LoginPlaintext必须不可序列化)!

我的AppConfig.java看起来是这样的:

代码语言:javascript
复制
public class AppConfig 
   ...
   Login loginData(ServletRequest request){
      if(request.getParameter('useMD5')!=null){
         return new LoginMD5Salted();
      }
      return new LoginPlaintext();
   }
}

我的PermissionBean .java看起来如下:

代码语言:javascript
复制
public class PermissionBean implements Serializable{
    @Autowired
    Login loginData;
}

我的LoginPlaintext看起来是这样的:

代码语言:javascript
复制
public class LoginPlaintext implements Login{
    String plainTextPassword;
    ....
}

我的LoginMD5Salted看起来是这样的:

代码语言:javascript
复制
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也没有任何问题。问题:

  1. 如何防止仅针对类LoginPlaintext的日志消息?
  2. 如果无法通过重新激活来反序列化LoginPlaintext,那么是否再次调用AppConfig的loginData()方法?
EN

回答 3

Stack Overflow用户

发布于 2013-05-09 10:23:50

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

另一种解决方法可以是组合一个范围会话bean,既具有登录风格,又可以标记您不想用瞬态序列化的会话bean。

票数 1
EN

Stack Overflow用户

发布于 2013-05-10 11:08:36

您可以定义一个具有会话作用域的bean,而不是两个具有会话作用域的bean,该会话作用域由两种类型(可序列化和不可序列化的)组成。

这可能是你的PermissionBean。

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

和上一次一样,我还没有真正做过,所以你要用一点点盐来做

票数 0
EN

Stack Overflow用户

发布于 2013-05-15 08:14:23

我想说,您为什么要在会话中首先存储LoginPlaintext?让loginData()返回一个只可能是可序列化的值存储在会话中是没有意义的。如果要存储会话,则会话中存储的任何内容都应该是可序列化的。因此,要么不将Login存储在会话中,要么使Login处于瞬态状态,或者不允许LoginPlaintext实现Login

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16298789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档