我有一个Netty HTTP服务器,我收到的请求看起来像这样:
https://someuser%40abc.com@server99.route1.abc.com/rest/of/path.xml
然后在我的处理程序中,我有一个DefaultHttpRequest对象。有没有办法从URL获取'someuser%40abc.com'?我是否必须先破解一些东西才能早点把它传下去?
答案 0 :(得分:2)
由于Netty中的DefaultHttpRequest中缺少'user'部分,我尝试使用示例Netty Snoop服务器调试Nety HttpDecoder :)。当我使用Chrome / wget连接到http://someuser@localhost:8080/rest/path
时,HttpDecoder没有收到某个用户部分作为要解码的标头,因此我通过获取Wireshark捕获的HTTP请求进一步检查,并且没有一些用户部分作为头。
原因是,HTTP客户端主要支持URI Scheme的通用语法,它们剥离了用户部分,并且大部分时间都没有包含头部。(查看Nadeem Douba的答案以获取更多详细信息)。如果http客户端可以将这些参数作为用户管理的头发送,则可以使用request.getHeader(“X-user-header”)访问它们。
答案 1 :(得分:1)
您的意思是询问如何从messageReceived()获取URL吗?
public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent e) throws Exception {
Object msg = e.getMessage();
if (msg instanceof HttpRequest) {
// New request so let's figure our the service to call
HttpRequest request = (HttpRequest) msg;
String uri = request.getUri();
// Use some string functions to extract what you want for the URI
String username = uri.substring(0, uri.indexOf("@")).substring(8);
}
}
答案 2 :(得分:0)
正如Jestan Nirojan先前提到的,URI方案仅由客户端支持。 HTTP服务器永远不会收到http://user@host
的请求。此外,在URI方案中使用身份验证凭据时,客户端只会在遇到挑战时传输这些凭据。为了澄清,第一个请求将尝试获取没有用户凭据的页面,如果服务器需要它们将挑战客户端,最后客户端将使用凭据重复请求。否则,如果客户端未受到质询,则将提供该页面,因此不会传输凭据。