在数据操作的情况下不暴露 Web 应用程序中的 ID

问题描述 投票:0回答:1
让我们考虑一个书籍存储库的示例,存储在经典 MVC 应用程序中的实体“Book”中。书籍具有非唯一的名称,这允许重复,因此通过书籍名称查找并不总是提供唯一的选择结果。

考虑这样的 Book 实体:

@Entity public class Book { @Id @GeneratedValue private Long id; private String title; private String ISBN; @ManyToMany // ommiting mapping details private Set<Author> bookAuthors; // getters, setters, etc. }
我们可能有用于特定目的的 DTO,例如在网页上显示数据

public class BookDto { private String title; private String ISBN; private Set<Author> bookAuthors; // getters, setters, etc. }
如果我错了,请纠正我,但好的做法是隐藏 ID,这意味着在这种情况下,不要在 DTO 中包含 ID 字段?
如果是,那么我们假设我们有“列出所有书籍”页面,在该页面上我们显示有关书籍的详细信息,并提供“编辑书籍数据”按钮(或删除,或任何形式的操作单个条目的数据),这应该调用特定书籍的编码功能。对我来说,它看起来像这样(不隐藏 ID,因为这是正确识别非唯一标题书的唯一方法):

<button type="button" onclick="editBookDetails(id)">Edit book details</button>
但正如之前提到的 - 我们应该将 ID 隐藏得尽可能深,并避免将其暴露在表层。但是这样的功能应该怎么写呢?如果不是通过其唯一 ID,如何识别要编辑的条目?

假设我们隐藏了 ID,构建此类操作的最佳实践是什么?也许有一些我不知道的方法。

附注是的,我知道,ISBN 有点独特。但还有许多其他数据示例不是书籍,并且没有像书籍那样可以安全公开的“公共”唯一 ID。

java model-view-controller
1个回答
0
投票
不要消除ID

好的做法是隐藏 ID

正如评论中所讨论的,不,你的前提是不正确的。将 ID 值包含为实体的一部分并没有什么问题。

事实上,如果您打算进一步工作,您

必须携带 ID 值。例如,当呈现一个对象列表供用户编辑或删除时,您将需要 ID 来区分哪个对象是哪个。毕竟ID是标识符,标识哪个对象需要编辑或删除。

也许抑制显示

用户可能对ID值不是特别感兴趣。如果是这样,请在用户界面中的

display 中隐藏该值。在幕后,您的应用程序仍然需要识别一个对象与另一个对象。

例如,当在表格网格中列出对象时,类中的每个字段都有一列,您可以选择禁止显示 ID 列。但您仍然需要该 ID 值才能进行如上所述的编辑/删除。

© www.soinside.com 2019 - 2024. All rights reserved.