#html #spring #jsp
#HTML #spring #jsp
Вопрос:
Я хотел бы реализовать таблицу с кнопкой в каждой строке для удаления этой строки. Теперь я спрашиваю себя, каков наилучший способ сделать это.
Кстати, я использую JSP с тегами Spring, но я думаю, что это обычный вопрос html.
На мой взгляд, у меня есть два варианта: использование ссылок или использование кнопок с формами
Пример ссылки (удаление пользователей):
<table>
<thead>
<tr>
<th>Delete Button</th>
<th>User Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<c:forEach var="user" items="users">
<tr>
<td>
<s:url value="/users/${user.userId}/delete" var="deleteUrl" />
<a href="${deleteUrl}"><icon:delete/></a>
</td>
<td>${user.userId}</td>
<td>${user.name}</td>
</tr>
</c:forEach>
</tbody>
</table>
Да, это должно сработать, но URL для удаления записи отображается непосредственно в браузере. Не очень экономит…
Кнопка с из примера (Удалить пользователей):
<table>
<thead>
<tr>
<th>Delete Button</th>
<th>User Id</th>
<th>Name</th>
</tr>
</thead>
<tbody>
<c:forEach var="user" items="users">
<tr>
<td>
<form:form action="/users/${user.userId}/delete" method="POST">
<button type="submit"><icon:delete/></button>
</form:form>
</td>
<td>${user.userId}</td>
<td>${user.name}</td>
</tr>
</c:forEach>
</tbody>
</table>
Это тоже должно сработать, но у вас есть один тег формы на кнопку. И URL для удаления записи, возможно, отображается после отправки в строке URL браузера.
Тоже не лучший способ…
Итак, какой, по-вашему, лучший способ? Или есть какие-либо другие, которые, возможно, лучше?
Комментарии:
1. И предоставление URL-адреса является бесполезным, потому что? Тем не менее, она доступна, даже если вы используете AJAX, получить URL-адрес довольно просто. Вам нужна форма с URL-адресом, и вы можете захотеть использовать DELETE в скрытом поле (так что вы можете использовать метод DELETE вместо POST). И, наконец, вы хотите добавить токен CSRF, чтобы только авторизованные пользователи могли использовать функцию удаления.
Ответ №1:
Никогда не используйте запрос GET (т. Е. ссылку) для удаления данных на сервере. Я помню известную историю (не уверен, была ли это МИСТИФИКАЦИЯ или нет) о том, что в одночасье все данные были удалены, причина в том, что Google проиндексировал сайт и перешел по всем ссылкам…
Вы хотите использовать способ формы и, вероятно, захотите использовать запрос на удаление, в spring вы можете настроить HiddenHttpMethodFilter
, затем при добавлении скрытого поля с именем _method
со значением DELETE
.
Далее вы хотите добавить токен CSRF в свою форму, чтобы убедиться, что удаление могут использовать только аутентифицированные (и авторизованные!) пользователи. Предполагая, что вы используете Spring Security (или собираетесь добавить), ваша окончательная форма должна выглядеть примерно так.
<form:form action="/users/${user.userId}" method="POST">
<input type="hidden" name="_method" value="DELETE" />
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<button type="submit"><icon:delete/></button>
</form:form>
В вашем контроллере у вас должен быть @DeleteMapping
для URL.
@DeleteMapping("/users/{id}")
public void remove(@PathVariable("id") Long uid) { ... }