2

我目前正在根据特定标准过滤文档列表。

然后我将此列表呈现给用户,我有一个

<p:commandButton action="#{controllerBean.downloadDocument(document.id)}" ajax="false" />

查看呈现的代码,我在任何地方都看不到文档 ID,但这并不意味着它以某种方式进行了编码,并且可以从客户端进行解码、更改和重新编码。

我对 JSF 状态处理的理解相当薄弱,但如果我错了,请纠正我:无法从客户端手动更改操作参数值的值,因为即使存储在客户端上,也只有服务器可以对会话进行解码和编码状态,参数值存储在那里。我是对的还是应该添加一个检查以downloadDocument(document.id)确保用户有权下载该特定文件document.id?无论如何,我将来都会添加此检查,但我想知道这个问题现在有多重要。

4

1 回答 1

3

它以 a 形式存储MethodExpression在 JSF 组件树中(而不是 JSF 视图状态!),并在INVOKE_APPLICATION相关命令组件触发的表单提交阶段在服务器端进行评估。它确实没有编码为 HTML 输出,与 eg 相反<f:param>(如果您熟悉 PrimeFaces,这也是为什么<p:graphicImage>不能在其值中使用 EL 方法参数但只能通过 HTTP 请求参数使用的原因嵌套<f:param>)。

唯一的“风险”是(间接)的期间INVOKE_APPLICATION评估值 #{document}取决于客户端可以控制的某些请求范围状态,例如请求参数或请求路径。请再次注意,#{document}在回发期间评估,而不是在初始请求期间评估。

为了更好地理解视图构建、渲染和状态保存,下面的问答可能会有所帮助:

于 2015-12-01T11:54:32.837 回答