我目前正在根据特定条件筛选文档列表。
然后我把这个列表呈现给用户,我有一个
<p:commandButton action="#{controllerBean.downloadDocument(document.id)}" ajax="false" />
查看呈现的代码,我在任何地方都看不到文档id,但这并不意味着它是以某种方式编码的,并且可以从客户端解码、更改和重新编码。
我对JSF状态处理的理解很弱,但是,如果我错了,请纠正我:从客户端手动更改操作参数值是不可能的,因为即使存储在客户端上,也只有服务器可以解码和编码会话状态,并且参数值存储在那里。我是对的,还是应该在downloadDocument(document.id)
中添加一个检查,以确保用户有权下载特定的document.id
?不管怎样,我都会在未来添加这张支票,但我想知道这个问题现在有多重要。
它以MethodExpression
的形式存储在JSF组件树中(而不是在JSF视图状态下!),并且在由有问题的命令组件触发的表单提交的INVOKE_APPLICATION
阶段在服务器端进行评估。事实上,它并没有被编码到HTML输出中,与<f:param>
相反(如果你熟悉PrimeFaces,这也是<p:graphicImage>
不能通过嵌套的<f:param>
处理EL方法参数而只能处理HTTP请求参数的原因)。
唯一的"风险"是#{document}
在INVOKE_APPLICATION
期间的评估值(间接)取决于客户端可以控制的某些请求范围的状态,例如请求参数或请求路径。请再次注意,#{document}
是在回发期间评估的,而不是在初始请求期间评估的。
为了更好地理解视图构建、渲染和状态保存,请参阅以下问答;A可能会有所帮助:
- 什么';视图构建时间是多少
- ';绑定';JSF中的属性工作?何时以及如何使用