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

从NettyRequest获取URL中指定的用户名,netty,Netty,我有一个Netty HTTP服务器,并且正在收到如下请求: 在我的处理程序中,我有一个DefaultHttpRequest对象。有没有办法从URL获取“someuser%40abc.com”?我是否必须修改一些内容才能更早地获取并传递它?你的意思是问如何从messageReceived()获取URL 正如Jestan Nirojan前面提到的,URI方案仅由客户端支持。HTTP服务器永远不会收到http://user@主机。此外,当在URI方案中使用身份验证凭据时,客户机只有在被质询这些凭据时

我有一个Netty HTTP服务器,并且正在收到如下请求:


在我的处理程序中,我有一个DefaultHttpRequest对象。有没有办法从URL获取“someuser%40abc.com”?我是否必须修改一些内容才能更早地获取并传递它?

你的意思是问如何从messageReceived()获取URL


正如Jestan Nirojan前面提到的,URI方案仅由客户端支持。HTTP服务器永远不会收到
http://user@主机
。此外,当在URI方案中使用身份验证凭据时,客户机只有在被质询这些凭据时才会传输这些凭据。为了澄清,第一个请求将尝试在没有用户凭据的情况下获取页面,如果服务器需要,它将质询客户端,最后客户端将使用凭据重复该请求。否则,如果客户端未被质询,页面将被提供,因此不会传输任何凭据。

由于Netty中DefaultHttpRequest中缺少“用户”部分,因此我尝试使用示例Netty Snoop服务器调试Nety HttpDecoder:)。当我连接到
http://someuser@localhost:8080/rest/path
使用Chrome/wget,HttpDecoder没有收到someuser部分作为要解码的头,因此我进一步检查了Wireshark捕获的HTTP请求,该请求也没有someuser部分作为头


原因是,HTTP客户机大多支持URI方案的通用语法,并且它们剥离了用户部分,大多数情况下不包含作为头的内容(有关更多详细信息,请查看Nadeem Douba的回答)。如果http客户端可以将这些参数作为用户管理的头发送,则可以使用request.getHeader(“X-user-header”)访问它们。

抱歉,这不起作用。My msg属于DefaultHttpRequest类型,getUri()只返回uri部分:/rest/of/path。要获取域名,请尝试获取“主机”http头。类似于
request.getHeader(“主机”)
Yeah。。。我也试过了。它将从主机头上剥离。停止猜测。HTTP支持这种URI方案吗?也就是说,HTTP支持您给定的URI方案的通用语法。当我使用浏览器/wget连接时,用户名部分不会出现在Wireshark捕获的HTTP request.Shit中。你说得对。我看了一下客户端日志,它显示了这个URL,但snoop说它并没有跨越网络:/。添加一个答案,我会接受。有趣的一点是:如果url中同时包含用户名和密码,Curl将添加一个授权标题,但是如果您只使用用户名,Curl将完全放弃它。Safari将其剥离并扔掉,就像我的客户端在打开http连接时一样:/n如果您想要积分,您需要添加一个答案!谢谢@Kylar,我很高兴我的评论帮助发现了这个问题,我不确定wired-URI方案是否有共同之处,我想知道它是否可以与其他一些http服务一起使用。现已张贴:)
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);
    }
}