上一篇文章分析了hessian客户端的源码,其实服务端的源码分析与客户端的差不多,只是服务端是先接收客户端的请求,将请求参数进行反序列化,再处理,将结果序列化转换成流返回给客户端,由于有了客户端源码分析,其他的就不多说了,直接上代码
1.为了能够跟进hessian服务端的源码,首先我们需要将导入hessian的jar包替换成源码,下面是我导入hessian源码的目录结构:
2.根据我们在hessian web中的web.xml配置的hessian servlet可知,接收客户端的请求是从HessianServlet中的service方法开始的,那么我们就在这个方法里面打个断点
调试的快捷方式:
F5进入方法 F6往下执行 F8到达下一个断点
下面是service方法中的代码
HttpServletRequest req = (HttpServletRequest) request;//转换成httpServletRequest
HttpServletResponse res = (HttpServletResponse) response;
if (! req.getMethod().equals("POST")) {
//判断请求方法是不是post方法
res.setStatus(500, "Hessian Requires POST");
PrintWriter out = res.getWriter();
res.setContentType("text/html");
out.println("<h1>Hessian Requires POST</h1>");
return;
}
String serviceId = req.getPathInfo();
String objectId = req.getParameter("id");
if (objectId == null)
objectId = req.getParameter("ejbid");
ServiceContext.begin(req, serviceId, objectId);
try {
InputStream is = request.getInputStream();
OutputStream os = response.getOutputStream();
response.setContentType("application/x-hessian");//设置请求类型
if (_log.isLoggable(Level.FINEST)
|| _isDebug && _log.isLoggable(Level.FINE)) {
PrintWriter dbg = new PrintWriter(new LogWriter(_log));
HessianDebugInputStream dIs = new HessianDebugInputStream(is, dbg);
dIs.startTop2();
is = dIs;
HessianDebugOutputStream dOs = new HessianDebugOutputStream(os, dbg);
dOs.startTop2();
os = dOs;
}
int code = is.read();
int major;
int minor;
AbstractHessianInput in;
AbstractHessianOutput out;
if (code == 'H') {
major = is.read();
minor = is.read();
if (major != 0x02 || minor != 0x00)
throw new IOException("Version " + major + "." + minor + " is not understood");
in = createHessian2Input(is);
out = new Hessian2Output(os);
in.readCall();
}
else if (code == 'c') {
major = is.read();
minor = is.read();
in = new HessianInput(is);//获取hessian自己封装的输入流
if (major >= 2)
out = new Hessian2Output(os);