`
buaixianchen
  • 浏览: 24119 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

httpInvoker获取客户端request

阅读更多

最近在使用HttpInvoker需要获取客户端的request进行额外操作,上网搜了一些资料,不过没有找到相关资料,区别去xfire获取request时使用的XfireServletAction.getRequest(),貌似没有看到httpInvoker提供这样的API
所以不能不去看源码。

先来看下HttpInvokerServiceExporter服务导出的源码:

    RemoteInvocation invocation;
    try
    {
      invocation = readRemoteInvocation(request);
      RemoteInvocationResult result = invokeAndCreateResult(invocation, getProxy());
      writeRemoteInvocationResult(request, response, result);
    }

handlerRequest执行了三部操作:

   1、获取客户端request请求,通过HTTP请求,得到客户端传过来的RemoteInvocation对象,该对象中封装了服务调用需要的基本信息。

   2、服务方法的调用,构建远端服务返回的结果,以RemoteInvocationResult返回,这一过程中蛮重要的一点是完成对象序列化。(后来在比较中才发现hessian和http-invoker的content-type的区别就在于这个地方)

   3、设置response的content-type,同时将result输出到http的response.

(个人理解还不够透彻.....我说错的地方,还请指出!谢谢)

所以其实Http-invoker这边还是可以获取到request,只是并没有提供一个地方保存当前线程的request,所以在这个地方进行了改动。

首先自定义一个类,用于保存当前request

public class HttpInvokerRequestContext {
 private HttpServletRequest _request;
 private static final ThreadLocal<HttpInvokerRequestContext> _localContext = new ThreadLocal<HttpInvokerRequestContext>() {
  public HttpInvokerRequestContext initialValue() {
   return new HttpInvokerRequestContext();
  }
 };
 
 private HttpInvokerRequestContext() {}
 
 public static final void setRequest(HttpServletRequest request) {
  _localContext.get()._request = request;
 }
 
 public static final HttpServletRequest getRequest() {
  return _localContext.get()._request;
 }
 
 public static final void clear() {
  _localContext.get()._request = null;
 }
}

然后修改HttpInvokerServiceExporter,在获取客户端request的时候将当前request保存进来

public class SelfHttpInvokerExporter extends HttpInvokerServiceExporter
  implements HttpRequestHandler {

 public void handleRequest(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
  RemoteInvocation remoteInvocation;
  try {
   remoteInvocation = this.readRemoteInvocation(request);
   HttpInvokerResponseContext.setHttpResponse(response);
   RemoteInvocationResult result = this.invokeAndCreateResult(remoteInvocation, super.getProxy());
   this.writeRemoteInvocationResult(request, response, result);
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  } finally {
   HttpInvokerRequestContext.clear();
   HttpInvokerResponseContext.clear();
  }
//  super.handleRequest(arg0, arg1);
 }
 
 protected RemoteInvocation readRemoteInvocation(HttpServletRequest request)
   throws IOException, ClassNotFoundException {
  HttpInvokerRequestContext.setRequest(request);
  return super.readRemoteInvocation(request);
 }

 protected void writeRemoteInvocationResult(HttpServletRequest request,
   HttpServletResponse response, RemoteInvocationResult result)
   throws IOException {
  super.writeRemoteInvocationResult(request, response, result);
 }

 protected RemoteInvocationResult invokeAndCreateResult(
   RemoteInvocation remoteInvocation, Object arg1) {
  return super.invokeAndCreateResult(remoteInvocation, arg1);
 }

最后修改下配置

 <bean name="/userLoginService" class="com.pokercity.core.httpInvoker.SelfHttpInvokerExporter">
  <property name="service" ref="userLoginService" />
  <property name="serviceInterface" value="com.pokercity.service.IUserLoginService" />
 </bean>

userLoginService里面需要用到request的时候,直接使用HttpInvokerRequestContext .getRequest()就可以了

测试了下可以获取到request对象

PS:个人使用总结,对于有些地方认识还不够深刻,如有错误,劳烦指出!

分享到:
评论

相关推荐

    用Http Invoker实现RCP客户端与后台的交互

    本文将深入探讨如何使用Http Invoker实现RCP客户端与后台的交互,以及相关知识点。 1. **Http Invoker的基本概念**: - Http Invoker是Spring框架的一个组件,它利用HTTP协议来传输Java对象,实现了客户端与服务器...

    http invoker 做post测试

    3. **配置HTTP Invoker**:在服务端配置Spring,启用HTTP Invoker的支持,将接口绑定到特定的URL路径上,以便客户端可以访问。 4. **客户端构建请求**:在客户端,我们需要创建一个HTTP Invoker的代理对象,该对象...

    使用httpInvoker提供远程服务

    客户端连接到HttpInvoker服务的过程涉及到几个关键步骤: 1. **创建代理**:客户端需要一个代理对象来调用远程服务。Spring提供了`HttpInvokerRequestExecutor`和`HttpInvokerProxyFactoryBean`来生成这个代理。`...

    Spring HttpInvoker

    Spring HttpInvoker,是一套基于Maven+Spring+SpringMVC+MyBatis框架,还包含了Invoker的客户端及服务器端的demo实例

    HttpInvoker.zip http调试工具

    《HttpInvoker:深入理解HTTP调试工具的奥秘》 在Web开发中,HTTP协议作为互联网应用的基础,扮演着至关重要的角色。为了确保我们的应用程序能够正确地与服务器进行通信,理解和调试HTTP请求至关重要。HttpInvoker...

    springboot-httpinvoker-demo.zip

    4. 异常处理:HTTP Invoker支持异常的透明传播,客户端可以捕获到服务器端抛出的异常,从而进行相应的处理。 四、HTTP Invoker优化与安全考虑 1. 性能优化:可以通过设置连接池、超时时间等参数来优化网络通信性能...

    Spring HttpInvoker的封装

    **Spring HttpInvoker的封装** 在Java企业级应用开发中,Spring框架因其强大的功能和灵活性而被广泛应用。HttpInvoker是Spring框架的一部分,它提供了一种基于HTTP协议的远程调用机制,使得不同网络环境中的Java...

    Http Invoker

    **Http Invoker:接口测试工具详解** Http Invoker是一款用于接口测试的工具,它允许开发者对Web服务进行调用和测试,验证API的功能和性能。虽然在某些用户看来,Http Invoker可能并不是最易用或者功能最全面的工具...

    httpinvoker.zip

    - 处理响应:接收到服务器的响应后,HTTPInvoker会解析响应头和响应体,你可以根据需要获取这些信息。 3. **在APP开发中的应用** - 功能测试:在APP开发过程中,可以使用HTTP Invoker测试后台接口,确保功能正常...

    Hessian 、 HttpInvoker 、 XFire 、 Axis

    通过定义一个`RemoteServicePool`接口,我们可以将具体的远程调用技术(如Hessian、HttpInvoker、XFire)的细节隐藏起来,开发者只需要通过接口方法`getService(String serviceId)`来获取服务,而无需关心服务的实现...

    Eclipse工程Http Invoker Service & Client

    【Eclipse工程Http Invoker Service & Client】是一个基于Eclipse集成开发环境的项目,它主要涉及到了使用HTTP协议来实现服务端(Service)与客户端(Client)之间的远程调用技术。Http Invoker是Spring框架的一个...

    spring-httpinvoker-demo

    Spring HTTP Invoker是spring框架中的一个远程调用模型,执行基于HTTP的远程调用,也就是说,可以通过防火墙,并使用java的序列化机制在网络间传递对象。客户端可以很轻松的像调用本地对象一样调用远程服务器上的...

    Spring HttpInvoker介绍

    公司内部讲义,比较了SOA,RMI和Spring HttpInvoker。并介绍了Spring HttpInvoker的基本使用方法。

    spring httpInvoker示例

    HTTP Invoker是Spring框架提供的一种轻量级远程调用解决方案,它利用HTTP协议在客户端和服务端之间传输Java对象。这种方式相比传统的RMI或SOAP更简单、灵活,因为它不需要额外的序列化和协议层。我们将从服务端和...

    HttpInvoker Sample

    HttpInvoker是Spring框架中的一种远程调用机制,主要用于在分布式系统中实现服务间的通信。它基于HTTP协议,允许客户端通过HTTP请求调用服务端的方法,实现了远程方法的透明调用。这个"HttpInvoker Sample"是一个...

    httpinvoker的使用实例

    HTTPInvoker是Spring框架中的一种远程调用机制,它允许客户端通过HTTP协议来调用服务器端的方法,实现远程服务的透明化访问。这个技术基于HTTP,所以具有较好的穿透性,适用于内网或者对安全性要求不高的环境。在这...

    Jmail+ HttpInvoker+定时任务+Aop+Rmi+

    本文将深入探讨标题和描述中提及的几个关键知识点:Jmail、HttpInvoker、AOP(面向切面编程)、RMI(远程方法调用)以及定时任务。这些技术在实际开发中都有着广泛的应用。 首先,Jmail是一个用于发送电子邮件的...

    Spring 实现远程访问详解——httpinvoker

    Spring httpInvoker使用标准java序列化机制,通过Http暴露业务服务。如果你的参数和返回值是比较复杂的,通过httpInvoker有巨大的优势。 1. 远程访问流程 1) 服务端定义服务接口 2) 服务端实现服务接口 3) 暴露服务...

    HttpInvoker

    模拟提交GET/POST,鞥呢返回详细头,cookies

    Java Spring2.5 Remote Invoke HTTP Invoker

    2. **客户端配置**:在客户端,同样需要一个Spring配置文件,创建一个`&lt;bean&gt;`,使用`http-invoker-service-ref`属性指向服务端的URL。 3. **编程模型**:客户端代码可以直接通过服务接口调用远程方法,Spring会自动...

Global site tag (gtag.js) - Google Analytics