我目前正按照一定的标准过滤文件清单。
然后我将此列表呈现给用户,我有一个
<p:commandButton action="#{controllerBean.downloadDocument(document.id)}" ajax="false" />
查看呈现的代码,我不会在任何地方看到文档ID,但这并不意味着它以某种方式编码,可以从客户端解码,更改和重新编码
我对JSF状态处理的理解相当薄弱但是,如果我错了,请纠正我:无法从客户端手动更改操作参数值的值,因为即使存储在客户端上,也只有服务器可以解码并编码会话状态,并将参数值存储在那里。我是对的,还是应该向downloadDocument(document.id)
添加支票,以确保用户有权下载该特定document.id
?我将来会添加这张支票,无论如何,但我想知道这个问题现在有多重要。
答案 0 :(得分:3)
它作为MethodExpression
存储在JSF组件树中(不在JSF视图状态中!),并且在命令组件触发的表单提交的INVOKE_APPLICATION
阶段期间在服务器端进行评估有问题。它实际上决不编码为HTML输出,相反,例如, <f:param>
(如果您熟悉PrimeFaces,那也正是<p:graphicImage>
无法在其值中使用EL方法参数但仅通过嵌套{{1}使用HTTP请求参数的原因})。
唯一的“风险”是<f:param>
的{{1}}评估值(间接)取决于客户端可以控制的某些请求范围状态,例如请求参数或请求路径。请再次注意,{@ 1}}在回发期间进行评估,而不是在初始请求期间进行评估。
为了更好地理解视图构建,渲染和状态保存,Q&amp; A下面的内容可能会有所帮助: