从NettyRequest获取URL中指定的用户名

时间:2012-03-12 14:10:40

标签: netty

我有一个Netty HTTP服务器,我收到的请求看起来像这样:

https://someuser%40abc.com@server99.route1.abc.com/rest/of/path.xml

然后在我的处理程序中,我有一个DefaultHttpRequest对象。有没有办法从URL获取'someuser%40abc.com'?我是否必须先破解一些东西才能早点把它传下去?

3 个答案:

答案 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方案中使用身份验证凭据时,客户端只会在遇到挑战时传输这些凭据。为了澄清,第一个请求将尝试获取没有用户凭据的页面,如果服务器需要它们将挑战客户端,最后客户端将使用凭据重复请求。否则,如果客户端未受到质询,则将提供该页面,因此不会传输凭据。