Лучшая практика в HTML? Как удалить запись таблицы с помощью отправки?

#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) { ... }