Spring Mvc Controller - проблема с удалением - PullRequest
2 голосов
/ 27 февраля 2011

я работаю в проекте j2ee (слой pojo, слой Dao (hibernate), служебный слой (spring), View (spring mvc)). У меня есть таблица статей после каждой строки, я хочу добавить ссылку для ее удаления.

это мой взгляд

<c:if test="${!empty articles}">
<table>
    <tr>
        <th>Article ID</th>
        <th>Article Name</th>
        <th>Article Desc</th>
        <th>Added Date</th>
        <th>operation</th>
    </tr>

    <c:forEach items="${articles}" var="article">
        <tr>
            <td><c:out value="${article.articleId}"/></td>
            <td><c:out value="${article.articleName}"/></td>
            <td><c:out value="${article.articleDesc}"/></td>
            <td><c:out value="${article.addedDate}"/></td>
            <td><a href="articles/${article.articleId}">delete</a></td>
        </tr>
    </c:forEach>
</table>

здесь контроллер для удаления

@RequestMapping(value="/articles/{articleId}", method=RequestMethod.POST)
public String deleteContact(@PathVariable("articleId")
Integer articleId) {

    articleService.removeArticle(articleId);

    return "redirect:/articles.html";
}

это слой обслуживания

    @Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void removeArticle(Integer id) {
    articleDao.removeArticle(id);
}

это слой Dao (я пытаюсь найти статью, а затем удалить ее)

    public void removeArticle(Integer id) {
            //to get the article
    Article article = (Article) sessionFactory.getCurrentSession().load(
            Article.class, id);
    if (null != article) {
        sessionFactory.getCurrentSession().delete(article);
    }

}

но когда я запускаю проект и нажимаю ссылку удаления, у меня появляется ошибка 404 Etat HTTP404 - / Spring3Hibernate / articles / 1 description Запрошенный ресурс (/ Spring3Hibernate / article / 1) недоступен

Может кто-нибудь мне помочь?

Ответы [ 2 ]

5 голосов
/ 27 февраля 2011
 <td><a href="articles/${article.articleId}">delete</a></td>

Это стандартный запрос GET, но ваш контроллер сопоставлен с POST.

@RequestMapping(value="/articles/{articleId}", method=RequestMethod.POST)

Кроме того, это выглядит как очень большая проблема безопасности.Я могу написать очень простую 10-строчную программу, которая будет вызывать, используя запрос get или post, из / article / 1 в / article / {любой номер} и удалять все ваши данные.Я рекомендую просто принять это во внимание при разработке таких приложений.

0 голосов
/ 27 февраля 2011

Попробуйте использовать метод запроса DELETE.Метод GET не рекомендуется для чего-то, что изменит значение на сервере / db.Если вы хотите придерживаться поста, сделайте его отправкой формы вместо href

RequestMapping(value="/articles/{articleId}", method=RequestMethod.DELETE)
...