publicclass SimpleHttpInvokerRequestExecutor extends AbstractHttpInvokerRequestExecutor {

//HTTP调用请求执行器真正进行远程调用的方法,该方法有其父类//AbstractHttpInvokerRequestExecutor的executeRequest方法调用

protected RemoteInvocationResult doExecuteRequest(

HttpInvokerClientConfiguration config, ByteArrayOutputStream baos)

throws IOException, ClassNotFoundException {

//打开一个标准的J2SE HttpURLConnection

HttpURLConnection con = openConnection(config);

//准备连接

prepareConnection(con, baos.size());

//远程调用被封装成了RemoteInvocation对象,它通过序列化被写到对应的//HttpURLConnection中

writeRequestBody(config, con, baos);

//获取远程调用的结果,校验返回的结果

validateResponse(config, con);

InputStream responseBody = readResponseBody(config, con);

//将远程调用结果转换成RemoteInvocationResult返回

return readRemoteInvocationResult(responseBody, config.getCodebaseUrl());

}

//打开一个HttpURLConnection

protected HttpURLConnection openConnection(HttpInvokerClientConfiguration config) throws IOException {

//getServiceUrl()方法获取配置的远程调用URL,打开一个URL连接

URLConnection con = new URL(config.getServiceUrl()).openConnection();

if (!(con instanceof HttpURLConnection)) {

thrownew IOException("Service URL [" + config.getServiceUrl() + "] is not an HTTP URL");

}

return (HttpURLConnection) con;

}

//准备HTTP请求连接

protectedvoid prepareConnection(HttpURLConnection con, int contentLength) throws IOException {

con.setDoOutput(true);

//HTTP调用器只支持POST请求方法

con.setRequestMethod(HTTP_METHOD_POST);

//设置HTTP请求头内容类型,设置为:application/x-java-serialized-object

con.setRequestProperty(HTTP_HEADER_CONTENT_TYPE, getContentType());

//设置HTTP请求头内容长度

con.setRequestProperty(HTTP_HEADER_CONTENT_LENGTH, Integer.toString(contentLength));

LocaleContext locale = LocaleContextHolder.getLocaleContext();

//设置HTTP请求的Locale

if (locale != null) {

con.setRequestProperty(HTTP_HEADER_ACCEPT_LANGUAGE, StringUtils.toLanguageTag(locale.getLocale()));

}

//设置HTTP请求压缩方式

if (isAcceptGzipEncoding()) {

con.setRequestProperty(HTTP_HEADER_ACCEPT_ENCODING, ENCODING_GZIP);

}

}

//把序列化对象输出到HTTP请求体中

protectedvoid writeRequestBody(

HttpInvokerClientConfiguration config, HttpURLConnection con, ByteArrayOutputStream baos)

throws IOException {

baos.writeTo(con.getOutputStream());

}

//校验远程调用的HTTP响应

protectedvoid validateResponse(HttpInvokerClientConfiguration config, HttpURLConnection con)

throws IOException {

//如果HTTP响应状态码大于等于300,则证明调用发生错误

if (con.getResponseCode() >= 300) {

thrownew IOException(

"Did not receive successful HTTP response: status code = " + con.getResponseCode() +

", status message = [" + con.getResponseMessage() + "]");

}

}

//提取远程调用结果的HTTP响应信息

protected InputStream readResponseBody(HttpInvokerClientConfiguration config, HttpURLConnection con)

throws IOException {

//如果响应信息是Gzip压缩的,则需要先解压

if (isGzipResponse(con)) {

returnnew GZIPInputStream(con.getInputStream());

}

//正常的HTTP响应

else {

return con.getInputStream();

}

}

//是否是Gzip格式压缩

protectedboolean isGzipResponse(HttpURLConnection con) {

//获取HTTP响应头信息中的压缩方式

String encodingHeader = con.getHeaderField(HTTP_HEADER_CONTENT_ENCODING);

return (encodingHeader != null && encodingHeader.toLowerCase().indexOf(ENCODING_GZIP) != -1);

}

}

java invoker_Spring的HTTPInvoker相关推荐

  1. java httpinvoker_Spring中HttpInvoker实例

    Spring版本2.5.6.SEC01 1.服务端: 需要如下jar包:spring.jar spring-webmvc.jar IPersonService.java public interfac ...

  2. 回首2015年小文codeRoad

    1.Java基础知识(排序.算法.设计模式.I/O.多线程.Swing等.面向对象编程思想) 2.前端框架:jqueryUI.EasyUI.BootStrap.Anglurjs.EXT.Html5.C ...

  3. java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置

    1.服务端 服务Java接口 package service; public interface TestService { int add(int i,int j); } 服务的Java实现 pac ...

  4. java httpinvoker漏洞_Java反序列化漏洞学习

    序列化是Java提供的一种对象持久化保存的技术.常规对象在程序结束后会被回收,如果想把对象持久保存方便下次使用,需要序列化和反序列化. 序列化有两个前提: 类必须实现java.io.serializa ...

  5. java httpinvoker漏洞_spring httpinvoker 例子

    1,创建接口: public interface HttpInvokerTestI { public TestPo getTestPo(String desp); } 实现: public class ...

  6. RMI、Hessian、Burlap、Httpinvoker、WebService的比较

    RMI.Hessian.Burlap.Httpinvoker.WebService的比较 标签: webserviceservice数据结构spring通讯java 2011-08-24 16:46 ...

  7. Java学习---RMI 技术分析[Hessian]

    一.什么是Hessian Hessian 是一个基于 binary-RPC 实现的远程通讯 library.使用二进制传输数据.Hessian通常通过Web应用来提供服务,通过接口暴露.Servlet ...

  8. Spring - Java/J2EE Application Framework 应用框架 第 16 章 通过Spring使用远程访问和web服务

    第 16 章 通过Spring使用远程访问和web服务 16.1. 简介 Spring提供类用于集成各种远程访问技术.这种对远程访问的支持可以降低你在用POJO实现支持远程访问业务时的开发难度.目前, ...

  9. 从Java程序员进阶到架构师,6大核心技能要领详解

    " java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...

最新文章

  1. [android] 从gallery获取图片
  2. Developerkit Link Develop Demo 环境配置指南
  3. .NET 动态向Word文档添加数据
  4. 【转】Linux下Oracle sqlplus无法使用命令退格删除和历史记录的解决方法(使用rlwrap)...
  5. PhpStorm 配置Xdebug
  6. mac查看端口,关闭进程
  7. dhtmlxTree 10分钟做一个树
  8. Kali Linux 网络扫描秘籍 翻译完成!
  9. Bootstrap框架下按钮的禁用
  10. 王小毛是懒惰了,还是堕落了?
  11. 台式计算机屏幕出现数字模拟,电脑显示器黑屏左上角显示数字模拟什么回事
  12. NM3200多用表校验仪
  13. 从《乔家大院》悟企业留人
  14. html加页面脚注,javascript – 打印HTML每页脚注
  15. 计算机科学中的数学第一章答案,翻译《计算机科学与数学》第一章第四节:我们的公理...
  16. PbootCMS制作个性分页条之单页/总页数效果教程
  17. 查询vue版本、脚手架版本
  18. NBMA(mgre)实验HCIP
  19. 宋宝华Linux培训笔记-Linux多线程
  20. 工作经验|lambada处理集合的常用10种实战骚操作,我都记录下来了

热门文章

  1. 解决LaTex中插入Visio画图有多余边框的问题
  2. ‘wmic‘ 不是内部或外部命令,也不是可运行的程序 解决方法
  3. 微信支付(JSAPI) - chooseWXPay fail 问题解决
  4. 解决微信二次分享失败--后面被加上from=singlemessageisappinstalled=0的解决方案
  5. 如何使用AngularJS绑定到复选框值列表?
  6. 用javascript实现自我执行功能的目的是什么?
  7. 可可:框架和边界之间有什么区别?
  8. 如何使用PHP获取当前年份?
  9. stateful openflow------整理openstate原理以及具体应用
  10. mysql(五)查询缓存