13

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

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

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

4

5 回答 5

14

由于我的 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>
于 2014-08-21T21:35:41.877 回答
3

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

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

于 2016-01-11T09:13:12.263 回答
2

以下是您可以从 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 规范以避免任何问题。

于 2013-07-25T09:19:42.503 回答
0

谢谢,它与添加只读参数的 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。

于 2021-11-27T17:48:57.907 回答
-1

要在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>

参数debuglistings默认在tomcat中加载,而默认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 标头    
                         在适当的地方回应?[真的]         

于 2014-09-27T01:33:16.237 回答