Primefaces ManagedBean方法正在更改dataTable对象

Primefaces ManagedBean方法正在更改dataTable对象,primefaces,jsf-2.2,bootsfaces,Primefaces,Jsf 2.2,Bootsfaces,我有一个,它列出了我正在工作的网页的“系统参数”。其中一个参数是邮件服务器密码,它在数据库中用Base64编码。在datatable的最后一列中,我有一个编辑参数的按钮,当我单击它时,会显示一个引导模式,其中包含字段“name”和“value” 我有一个带有@ViewScoped作用域的ManagedBean,还有一个函数,它还可以识别要编辑的参数是否是邮件服务器密码,并对值进行解码。该方法获取对象作为datatable迭代对象的参数。我的问题是,第一次打开模态时,对象的值是正确的,但第二次对象

我有一个
,它列出了我正在工作的网页的“系统参数”。其中一个参数是邮件服务器密码,它在数据库中用Base64编码。在datatable的最后一列中,我有一个编辑参数的按钮,当我单击它时,会显示一个引导模式,其中包含字段“name”和“value”

我有一个带有
@ViewScoped
作用域的ManagedBean,还有一个函数,它还可以识别要编辑的参数是否是邮件服务器密码,并对值进行解码。该方法获取对象作为datatable迭代对象的参数。我的问题是,第一次打开模态时,对象的值是正确的,但第二次对象值更改时,它会生成一个异常,因为该值已被解码,并且该值内部有一个点,它会生成错误

我不明白为什么datatable对象的值会被更改,而我从来没有按字面意思更改过它

我使用的是PrimeFaces、BootsFaces和JSF2.2。这是我的

最后,正如我第一次打开模式时所说,打印的输出如下:

ENCODE: MTIzLjQ1Ng==
但第二次,它显示:

ENCODE: 123.456
java.lang.IllegalArgumentException: Illegal base64 character 2e
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at com.abcpagos.otis.beans.admin.ParametroBean.editarParametro(ParametroBean.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)...

如果有人能给我解释一下这种行为,我将非常感激。

事实上,您确实意外地更改了参数。请看以下几行:

byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
//                                          ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
//         ^^^^^^^^^^^^^^^                

因此,当您第二次尝试解码已以纯文本形式存储的参数时。

尽管这与您的问题没有什么关系:从安全角度来看,永远不要解码密码。始终使用编码版本。一些黑客有工具扫描内存中的密码。只要他们只能看到编码的版本,就不会造成什么伤害。另外,您应该采用单向加密。不应该有办法从加密密码表的副本中猜出未加密的密码;我决定对密码进行解码,以防用户想要保留相同的密码,但添加一些字符,例如,如果密码是
123.456
,而用户现在想要
123.45677
。但我认为最好让用户编写完整的密码,因为它总是想更改密码。也许我有点困惑,但我仍然不明白,因为
p
对象与与
getParam()
方法关联的对象不同。在我的bean中,我有一个
私有TblParameter参数声明,我使用它以模态形式显示数据(dataTable对象中的数据),因此理论上我不会过度使用dataTable对象,因为我只使用它来获取值,对吗?你确定
p.getvlrparmeter()
getParam()
是不同的对象吗?我不能从你给我们看的那一点点源代码来判断。然而,开发人员经常复制变量,而不考虑变量只是对内存位置的引用(或指针)。我想这也是这里发生的事情。通常,我通过检查Eclipse调试器中的变量来跟踪此类错误。在调试器窗口中,它不仅显示值,还显示
id
。这个
id
是(某种)指向内存位置的指针。您的变量是否共享一个公共的
id
?顺便说一句,我想其他IDE也可以使用相同的技巧。我明白了,可能是对象引用。我将尝试调试代码。非常感谢。
ENCODE: 123.456
java.lang.IllegalArgumentException: Illegal base64 character 2e
at java.util.Base64$Decoder.decode0(Base64.java:714)
at java.util.Base64$Decoder.decode(Base64.java:526)
at com.abcpagos.otis.beans.admin.ParametroBean.editarParametro(ParametroBean.java:146)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)...
byte[] clv64 = Base64.getDecoder().decode(p.getVlrParameter().getBytes());
//                                          ^^^^^^^^^^^^^^^
getParam().setVlrParameter(new String(clv64));
//         ^^^^^^^^^^^^^^^