如何自定义响应错误 400 错误请求

Posted

技术标签:

【中文标题】如何自定义响应错误 400 错误请求【英文标题】:How to customize response Error 400 Bad Request 【发布时间】:2014-09-28 05:04:08 【问题描述】:

我有一个由码头提供的网络服务。 如何过滤带有非法字符的 URL?

当请求URL中有非法字符时,我无法控制一些返回信息。

实际上,我想在 URL 无效时返回一些特定信息。 例如:我在我的应用程序中添加了一个过滤器来验证 URL,如果非法,那么我将返回定义的信息。

但是,我无法过滤某些 URL,例如“%adsasd”,它似乎是由码头处理的。

curl -v -X PUT -u 用户:密码'http://myip.com:8080/%adsasd'

*   Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
* Server auth using Basic with user 'user'
> PUT /%adsasd HTTP/1.1
> Authorization: Basic YWRtaW46MTIzNDU2
> User-Agent: curl/7.35.0
> Accept: */*
> Host:127.0.0.1:8080
>  < HTTP/1.1 400 Bad Request 
   < Content-Length: 0
* Server Jetty(9.0.6.v20130930) is not blacklisted 
   < Server: Jetty(9.0.6.v20130930) < 
* Connection #0 to host 127.0.0.1 left intact

【问题讨论】:

【参考方案1】:

Jetty 的错误响应

HTTP/1.1 400 Bad Request

表示 Jetty 确实将其检测为错误的 URL 并拒绝了它。

至于如何自定义这个,确实很棘手,主要是因为它在处理这个特定请求时发生的时间有多早。

这种错误 (400 Bad Request) 发生在解析原始传入 http 请求的过程中,甚至在服务器容器还没有尝试确定要与什么上下文对话之前。

没有办法在特定的 webapp 上下文中使用自定义错误处理程序来处理这种基本的 http 错误。因为服务器还没有弄清楚要与什么上下文对话。

在服务器端(甚至在全局级别)也无法自定义此错误消息。

如果你想要这样的功能,please file a feature request。

【讨论】:

是的,但是我可以处理错误的 URL 并使用自定义信息拒绝吗?例如:返回一个 json 字符串 "error":"you need check your URL" 等。 我想通过我的过滤器而不是码头容器拒绝错误的 URL。但是,现在码头拒绝了错误 URL 的请求,没有发送到我的应用程序。 正如答案所指出的那样,由于这从根本上来说很糟糕,所以码头无法知道将其发送到哪个上下文(即您的 webapp),它永远不会被发送到应用程序在您的服务器上,它太坏而无法处理。这是一个早期的协议错误。有效的 HTTP 客户端应根据 HTTP 响应代码而不是正文内容来处理此错误。

以上是关于如何自定义响应错误 400 错误请求的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义错误处理程序时如何从中止命令访问错误消息

.net core 自定义规范响应的中间件

我收到错误 400:自定义 Heroku 域上的错误请求,但在 foo.herokuapp.com 上工作正常

如何使用自定义消息处理错误请求 Web api 核心?

Laravel:如何根据路由响应自定义 404 错误

如何在 HTTP 403 响应中获取自定义错误响应文本