客户端可以更改 bean 操作方法中 EL 方法参数的值吗?

Can client change value of EL method parameter in bean action method?

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

然后我将这个列表呈现给用户并且我有一个

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

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

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

它作为 MethodExpression 存储在 JSF 组件树中(而不是在 JSF 视图状态中!)并且在由有问题的命令组件。它确实绝不会编码为 HTML 输出,与例如相反。 <f:param>(如果您熟悉 PrimeFaces,这也正是 <p:graphicImage> 无法在其值中使用 EL 方法参数而只能通过嵌套 <f:param>).

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

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

  • How does the 'binding' attribute work in JSF? When and how should it be used?