我有一个Struts 2,Spring安全应用。我有一个要求,我需要使JSP中的字段只读。如果登录的用户不是文档的创建者,那么他/她不应该只是查看信息来编辑文档。有什么方法可以使用struts和JSP实现这一点吗?或者我需要一个不同的表格进行阅读和编辑?
答案 0 :(得分:1)
这是假设您在会话中为当前用户保存某种身份证明。
在表单上,使用三元运算符来了解它是否应该readonly
。
像这样:
<input type="text" ... ${sessionScope.userId.equals(userIdOfTheCreator)?"":"readonly"}>
如果当前用户与创建文档的用户相同,则不要添加readonly
属性,否则执行其他操作。
答案 1 :(得分:1)
有几种方法可以做到这一点。
假设List<Document> documents;
和Document
对象包含documentId
,ownerId
,description
以及某个地方存储的用户对象等字段,并且可通过getCurrentUser()(例如,来自其他的扩展的BaseAction),你可以用
<s:iterator value="allDocuments" var="currentDocument" status="stat">
<s:hidden name="allDocuments[%{#stat.index}"].documentId />
<s:if test="%{currentUser.id.equals(#currentDocument.ownerId)}">
<s:textfield name="allDocuments[%{#stat.index}"].description" />
</s:if>
<s:else>
<s:textfield name="allDocuments[%{#stat.index}"].description"
readonly="true" />
</s:else>
<br/>
</s:iterator>
如果您必须执行更复杂的检查,可以在迭代文档时调用Action函数:
<s:iterator value="allDocuments" var="currentDocument" status="stat">
<s:hidden name="allDocuments[%{#stat.index}"].documentId />
<s:if test="%{amIOwnerOfThisDocument(#currentDocument.ownerId)}">
<s:textfield name="allDocuments[%{#stat.index}"].description" />
</s:if>
<s:else>
<s:textfield name="allDocuments[%{#stat.index}"].description"
readonly="true" />
</s:else>
<br/>
</s:iterator>
并在行动中:
public boolean amIOwnerOfThisDocument(String ownerId){
return getService().checkSomethingComplex(getCurrentUser().getId(),ownerId);
}
等等。
重要提示:在接受从JSP收到的数据时,不要忘记复制此类控制服务器端...恶意用户很容易伪造请求包含不应由他修改的数据,例如。使用Firebug / Firefox控制台,只需删除readonly
属性。