如何自定义响应错误 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 错误请求的主要内容,如果未能解决你的问题,请参考以下文章