java invoker_Spring的HTTPInvoker
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相关推荐
- java httpinvoker_Spring中HttpInvoker实例
Spring版本2.5.6.SEC01 1.服务端: 需要如下jar包:spring.jar spring-webmvc.jar IPersonService.java public interfac ...
- 回首2015年小文codeRoad
1.Java基础知识(排序.算法.设计模式.I/O.多线程.Swing等.面向对象编程思想) 2.前端框架:jqueryUI.EasyUI.BootStrap.Anglurjs.EXT.Html5.C ...
- java httpinvoker漏洞_Spring HttpInvoker 服务端安全验证的和客户端请求配置
1.服务端 服务Java接口 package service; public interface TestService { int add(int i,int j); } 服务的Java实现 pac ...
- java httpinvoker漏洞_Java反序列化漏洞学习
序列化是Java提供的一种对象持久化保存的技术.常规对象在程序结束后会被回收,如果想把对象持久保存方便下次使用,需要序列化和反序列化. 序列化有两个前提: 类必须实现java.io.serializa ...
- java httpinvoker漏洞_spring httpinvoker 例子
1,创建接口: public interface HttpInvokerTestI { public TestPo getTestPo(String desp); } 实现: public class ...
- RMI、Hessian、Burlap、Httpinvoker、WebService的比较
RMI.Hessian.Burlap.Httpinvoker.WebService的比较 标签: webserviceservice数据结构spring通讯java 2011-08-24 16:46 ...
- Java学习---RMI 技术分析[Hessian]
一.什么是Hessian Hessian 是一个基于 binary-RPC 实现的远程通讯 library.使用二进制传输数据.Hessian通常通过Web应用来提供服务,通过接口暴露.Servlet ...
- Spring - Java/J2EE Application Framework 应用框架 第 16 章 通过Spring使用远程访问和web服务
第 16 章 通过Spring使用远程访问和web服务 16.1. 简介 Spring提供类用于集成各种远程访问技术.这种对远程访问的支持可以降低你在用POJO实现支持远程访问业务时的开发难度.目前, ...
- 从Java程序员进阶到架构师,6大核心技能要领详解
" java架构师技能将分为如下6大环节:数据结构和算法,Java高级特性,Java web核心,数据库,Java框架与必备工具,系统架构设计. 希望能真正帮助到从程序员进阶到架构师之路的朋 ...
最新文章
- [android] 从gallery获取图片
- Developerkit Link Develop Demo 环境配置指南
- .NET 动态向Word文档添加数据
- 【转】Linux下Oracle sqlplus无法使用命令退格删除和历史记录的解决方法(使用rlwrap)...
- PhpStorm 配置Xdebug
- mac查看端口,关闭进程
- dhtmlxTree 10分钟做一个树
- Kali Linux 网络扫描秘籍 翻译完成!
- Bootstrap框架下按钮的禁用
- 王小毛是懒惰了,还是堕落了?
- 台式计算机屏幕出现数字模拟,电脑显示器黑屏左上角显示数字模拟什么回事
- NM3200多用表校验仪
- 从《乔家大院》悟企业留人
- html加页面脚注,javascript – 打印HTML每页脚注
- 计算机科学中的数学第一章答案,翻译《计算机科学与数学》第一章第四节:我们的公理...
- PbootCMS制作个性分页条之单页/总页数效果教程
- 查询vue版本、脚手架版本
- NBMA(mgre)实验HCIP
- 宋宝华Linux培训笔记-Linux多线程
- 工作经验|lambada处理集合的常用10种实战骚操作,我都记录下来了
热门文章
- 解决LaTex中插入Visio画图有多余边框的问题
- ‘wmic‘ 不是内部或外部命令,也不是可运行的程序 解决方法
- 微信支付(JSAPI) - chooseWXPay fail 问题解决
- 解决微信二次分享失败--后面被加上from=singlemessageisappinstalled=0的解决方案
- 如何使用AngularJS绑定到复选框值列表?
- 用javascript实现自我执行功能的目的是什么?
- 可可:框架和边界之间有什么区别?
- 如何使用PHP获取当前年份?
- stateful openflow------整理openstate原理以及具体应用
- mysql(五)查询缓存