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));
// ^^^^^^^^^^^^^^^