Spring Mvc Controller - 删除问题

Posted

技术标签:

【中文标题】Spring Mvc Controller - 删除问题【英文标题】:Spring Mvc Controller - problem with delete 【发布时间】:2011-07-05 05:59:44 【问题描述】:

我在一个 j2ee 项目中工作(pojo 层、Dao 层(休眠)、服务层(spring)、视图(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 HTTP 404 - /Spring3Hibernate/articles/1 说明请求的资源(/Spring3Hibernate/articles/1)不可用

有人可以帮我吗?

【问题讨论】:

您确定“a href”部分发送的是 POST 请求而不是 GET 请求吗? 【参考方案1】:
 <td><a href="articles/$article.articleId">delete</a></td>

这是标准的 GET 请求,但您的控制器映射到 POST。

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

此外,它看起来像一个非常大的安全问题。我可以编写非常简单的 10 行程序,该程序将使用 get 或 post 请求调用从 /articles/1 到 /articles/any number 并删除您的整个数据。我建议在设计此类应用程序时将其考虑在内。

【讨论】:

您能否提供一些关于防止这种安全漏洞的提示?【参考方案2】:

尝试将请求方法设为DELETE。不建议使用 GET 方法来更改服务器/数据库中的值。如果您想坚持使用 post,请将其作为表单提交而不是 href

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

【讨论】:

但他的链接仍会将请求作为 GET 发送。这会比使用 RequestMethod.POST 更好吗? 我忘了说,谢谢指正。它必须是表单中的帖子。 HTTP 状态 405 - 不支持请求方法“POST”我尝试了所有这些仍然发生上述情况。删除请求已转换为 POST

以上是关于Spring Mvc Controller - 删除问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Mvc——Controller中常规方法示例

spring mvc controller实现原理

Spring mvc框架 controller间跳转 ,重定向 ,传参

Spring MVC 基础注解之@RequestMapping@Controller

Spring MVC controller间跳转 重定向 传参

Spring MVC学习笔记——给Controller传值