《Apache Dubbo微服务开发从入门到精通》——通信协议—— 四、 Rest协议(4) https://developer.aliyun.com/article/1224565
10) 获取Context信息
在远程调用中,值得获取的上下文信息可能有很多种,这里特别以获取客户端IP为例。
在dubbo的REST中,我们有两种方式获取客户端IP。
第一种方式,用JAX-RS标准的@Context annotation。
用Context修饰getUser()的一个方法参数后,就可以将当前的HttpServletRequest注入进来,然后直接调用servlet api获取IP。
注:
这种方式只能在将server设置为tjws、tomcat、jetty或者servlet的时候才能工作,因为只有这几种server的实现才提供了servlet容器。另外,标准的JAX-RS还支持用@Context修饰service类的一个实例字段来获取HttpServletRequest,但在dubbo中我们没有对此作出支持。
第二种方式,用dubbo中常用的RpcContext。
注:
这种方式只能在设置server="jetty"或者server="tomcat"或者server="servlet"或者server="tjws"的时候才能工作。另外,目前dubbo的RpcContext是一种比较有侵入性的用法,未来我们很可能会做出重构。
如果你想保持你的项目对JAX-RS的兼容性,未来脱离dubbo也可以运行,请选择第一种方式。如果你想要更优雅的服务接口定义,请选用第二种方式。
此外,在最新的dubbo rest中,还支持通过RpcContext来获取HttpServletRequest和HttpServletResponse,以提供更大的灵活性来方便用户实现某些复杂功能,比如在dubbo标准的filter中访问HTTP Header。用法示例如下:
注:
为了保持协议的中立性,RpcContext.getRequest()和RpcContext.getResponse()返回的仅仅是一个Object类,而且可能为null。所以,你必须自己做null和类型的检查。
注:
只有在设置server="jetty"或者server="tomcat"或者server="servlet"的时候,你才能通过以上方法正确的得到HttpServletRequest和HttpServletResponse,因为只有这几种server实现了servlet容器。
为了简化编程,在此你也可以用泛型的方式来直接获取特定类型的 request/response:
如果request/response不符合指定的类型,这里也会返回null。
《Apache Dubbo微服务开发从入门到精通》——通信协议—— 四、 Rest协议(6) https://developer.aliyun.com/article/1224562