根据文档创建使jsp字段只读

时间:2014-09-01 10:36:46

标签: jsp struts2 jsp-tags

我有一个Struts 2,Spring安全应用。我有一个要求,我需要使JSP中的字段只读。如果登录的用户不是文档的创建者,那么他/她不应该只是查看信息来编辑文档。有什么方法可以使用struts和JSP实现这一点吗?或者我需要一个不同的表格进行阅读和编辑?

2 个答案:

答案 0 :(得分:1)

这是假设您在会话中为当前用户保存某种身份证明。

在表单上,​​使用三元运算符来了解它是否应该readonly。 像这样:

<input type="text" ... ${sessionScope.userId.equals(userIdOfTheCreator)?"":"readonly"}>

如果当前用户与创建文档的用户相同,则不要添加readonly属性,否则执行其他操作。

答案 1 :(得分:1)

有几种方法可以做到这一点。

假设List<Document> documents;Document对象包含documentIdownerIddescription以及某个地方存储的用户对象等字段,并且可通过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属性。