如何让 Apache Tomcat 接受 DELETE 方法

Posted

技术标签:

【中文标题】如何让 Apache Tomcat 接受 DELETE 方法【英文标题】:How to make Apache Tomcat accept DELETE method 【发布时间】:2013-07-25 02:20:49 【问题描述】:

我正在开发一个 RESTful Web 服务项目,我正在使用 Apache Tomcat 和 JAX-RS。

我想接受来自客户端的 DELETE 请求,但是每当我从 Advanced REST 客户端 Chrome 插件发送 DELETE 请求时,它都会给出响应代码 403 Forbidden。

那么我怎样才能让 Apche Tomcat 接受 DELETE 请求呢?

【问题讨论】:

是的,我的设置也有同样的问题。我尝试将默认 Servlet 设置为 readOnly = false 但它仍然没有帮助。现在我只使用 POST + GET 【参考方案1】:

谢谢,它与添加只读参数的 SERVLET 段一起工作! (正如 Moesio 解释的那样)此外,我从发布的原始代码中删除了 DELETE,所以,我把它留了下来:

<init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET, POST, PUT, OPTIONS, HEAD</param-value>
</init-param>

我正在使用 this.http.delete 请求使用 IONIC 5。

【讨论】:

【参考方案2】:

还有一个建议,仔细检查调用的 URL 并确保它指向您想要的 servlet。

当我在代码中输入错误的服务 URL 时,我遇到了同样的错误。当我需要 api/rolesService/roles 时,我有 api/roles/Service/roles,修复错字解决了错误。您会期望 404,但在 Tomcat 上使用 DELETE,您会得到 403。

【讨论】:

完全相同的问题。这拯救了我的一天!【参考方案3】:

要在tomcat中启用其他http方法,请在web.xml中配置

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

tomcat中默认加载参数debuglistings,而默认readonly为true,表示只有GET和POST可用。

其他可用的参数是:

调试记录的消息的调试详细级别 通过这个 servlet。 [0] fileEncoding 用于读取静态资源的编码 [平台默认] input 读取时的输入缓冲区大小(以字节为单位) 要服务的资源。 [2048] Listings 是否应该产生目录列表,如果有 此目录中没有欢迎文件吗? [错误的] 警告:目录列表有很多 条目可能很慢并且可能会消耗 很大比例的服务器资源。 output 写入时的输出缓冲区大小(以字节为单位) 要服务的资源。 [2048] readonly 这个上下文是“只读”的,所以 HTTP PUT 和 DELETE 等命令是 被拒绝? [真的] readmeFile 与目录一起显示的文件 内容。 [空值] sendfileSize 如果使用的连接器支持 sendfile,则此 表示以 KB 为单位的最小文件大小 将使用哪个发送文件。使用负数 值始终禁用 sendfile。 [48] useAcceptRanges 是否应包含 Accept-Ranges 标头 在适当的地方回应? [真的]

【讨论】:

您的环境可能有问题。它不仅适用于我,也适用于投票给我的其他人。你为什么投票给我? 我已经解决了我的问题,结果我并没有真正发送 DELETE 请求。 致所有阅读此答案的人。您应该在默认 servlet 中将 readonly 设置为 false 以启用针对您的 REST API 的 PUT 和 DELETE 请求。这允许未经身份验证的用户上传和删除文件,并在 2017 年 10 月之前发布的 Tomcat 中导致严重的远程代码执行 (RCE) 漏洞:alphabot.com/security/blog/2017/java/…【参考方案4】:

由于我的 CORS 过滤器,Tomcat 阻止了我的 DELETE 方法。

我需要在我的 web.xml 文件中注册的新过滤器。这是一个非常宽容的例子:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
    <init-param>
        <param-name>cors.allowed.headers</param-name>
        <param-value>Accept,Accept-Encoding,Accept-Language,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization,Connection,Content-Type,Host,Origin,Referer,Token-Id,User-Agent, X-Requested-With</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.origins</param-name>
        <param-value>*</param-value>
    </init-param>
    <init-param>
        <param-name>cors.allowed.methods</param-name>
        <param-value>GET, POST, PUT, DELETE, OPTIONS, HEAD</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

【讨论】:

【参考方案5】:

以下是您可以从 Tomcat 中针对 DELETE 请求获得 403 Forbidden 的原因:

在此 servlet 处理的每个 HTTP DELETE 请求上,以下内容 应进行处理:

如果不允许修改静态资源(由配置参数设置),则返回 HTTP 状态 403(禁止)。

如果尝试从 /META-INF 或 /WEB-INF 中删除资源,则返回 HTTP 状态 403(禁止)。

如果请求的资源不存在,返回HTTP状态404(未找到)

从包含此 Web 应用程序的静态资源的目录上下文中取消绑定资源。如果成功,返回 HTTP 状态 204(无内容)。否则,返回 HTTP 状态 405 (不允许的方法)。

来源:http://tomcat.apache.org/tomcat-5.5-doc/catalina/funcspecs/fs-default.html

确保遵守 tomcat 规范以避免任何问题。

【讨论】:

问题中提到了 JAX-RS,那么这有什么关系呢? @mthmulders JAXRS 或任何其他 Web 服务框架位于 tomcat 请求拦截器后面。如果 tomcat 拒绝来自容器级别的请求,您的 jaxrs 代码将不会被执行。

以上是关于如何让 Apache Tomcat 接受 DELETE 方法的主要内容,如果未能解决你的问题,请参考以下文章

关于Tomcat集群中,图片文件等同步的问题

使用 Spring Boot、Apache 和 Tomcat 在客户端/服务器系统中配置 CORS

如何将 mod_rewrite 与 Apache -> mod_jk -> tomcat 设置一起使用?

如何在apache 配置虚拟目录

如何让页面仅在使用 cloudflare 时接受来自我网站的 iframe 请求?

如何在 Tomcat 中启用 JMXMP?