我正在开发一个 RESTful Web 服务项目,我正在使用 Apache Tomcat 和 JAX-RS。
我想接受来自客户端的 DELETE 请求,但是每当我从 Advanced REST 客户端 Chrome 插件发送 DELETE 请求时,它都会给出响应代码 403 Forbidden。
那么我怎样才能让 Apche Tomcat 接受 DELETE 请求呢?
我正在开发一个 RESTful Web 服务项目,我正在使用 Apache Tomcat 和 JAX-RS。
我想接受来自客户端的 DELETE 请求,但是每当我从 Advanced REST 客户端 Chrome 插件发送 DELETE 请求时,它都会给出响应代码 403 Forbidden。
那么我怎样才能让 Apche Tomcat 接受 DELETE 请求呢?
由于我的 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>
还有一个建议,仔细检查你的调用的 URL 并确保它指向你想要的 servlet。
当我在代码中输入错误的服务 URL 时,我得到了同样的错误。当我api/roles/Service/roles
需要时api/rolesService/roles
,修复错字解决了错误。你会期望一个 404,但是在 Tomcat 上使用 DELETE,你会得到一个 403。
以下是您可以从 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 规范以避免任何问题。
谢谢,它与添加只读参数的 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。
要在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>
参数debug
和listings
默认在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 标头 在适当的地方回应?[真的]