在项目中,可能存对Hessian的特殊的要求改造,以下两个例子就是我在项目中遇到的
一、对服务器方法调用前做一些校验,获取客户端请求参数
实现方法:继承com.caucho.hessian.server.HessianServlet重写service方法,代码如下:
/** * 本地化的HessianServlet,用于服务务器方法调用前的校验 * * @author ZhangMingxue * */ public class MHessianServlet extends HessianServlet { private static final long serialVersionUID = 1620619522783394602L; @SuppressWarnings("unchecked") @Override public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { System.out.println("服务器方法调用前"); // 在service方法中可以将request强转成HttpServletRequest,就可以获取很多信息 HttpServletRequest req = (HttpServletRequest) request; String path = req.getContextPath(); String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/"; // 1.获取客户端请求路径 String requestURI = req.getRequestURI(); System.out.println(basePath); System.out.println(requestURI); // 2.获取客户端参数信息 Enumeration<String> parameterNames = req.getParameterNames(); if (null != parameterNames) { while (parameterNames.hasMoreElements()) { String paramterValue = req.getParameter(parameterNames .nextElement()); System.out.println(paramterValue); } } // 3.会话管理 ... super.service(request, response); System.out.println("服务器方法调用后"); } }
配置如下:配置成自己继承后的Servlet
<servlet> <servlet-name>HelloServlet2</servlet-name> <!-- 自己继承后的Servlet --> <servlet-class>com.mengya.hessian.MHessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>com.mengya.imple.HelloImple</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.mengya.inter.IHello</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>HelloServlet2</servlet-name> <url-pattern>/HelloServlet2</url-pattern> </servlet-mapping>
客户端测试:
public class Hello2Test { public static void main(String[] args) { // 服务器访问路径 String url = "http://127.0.0.1:8080/HessianDemos/HelloServlet2?method=add¶m=p1"; HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); try { // IHello是客户端的接口,与服务器接口一致(客户端的语言包括:Java,Objective C,Flex 等) IHello iHello = (IHello) hessianProxyFactory.create(IHello.class, url); // 客户端调服务器的接口实现 System.out.println("Result == " + iHello.sayHello()); } catch (MalformedURLException e) { e.printStackTrace(); } } }
二、获取客户端的请求URL,对于特殊的URL重新转发,继承Hessian的Servlet,改造service和invoke方法
实现代码如下:
/** * 本地化的HessianServlet,用于请求转发 * * @author ZhangMingxue * */ public class ForwardHessianServlet extends HessianServlet { private static final long serialVersionUID = 4497196628911041481L; @Override public void service(ServletRequest request, ServletResponse response) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; // 客户端的请求路径 String requestURI = req.getRequestURI(); this.realizeService(request, response, requestURI); } // 在原service()方法添加了一个参数 @SuppressWarnings("deprecation") public void realizeService(ServletRequest request, ServletResponse response, String requestURI) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; if (!req.getMethod().equals("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"); SerializerFactory serializerFactory = getSerializerFactory(); // 修改为调用自己的invoke方法 this.invoke(is, os, objectId, serializerFactory, requestURI); } catch (RuntimeException e) { throw e; } catch (ServletException e) { throw e; } catch (Throwable e) { throw new ServletException(e); } finally { ServiceContext.end(); } } protected void invoke(InputStream is, OutputStream os, String objectId, SerializerFactory serializerFactory, String requestURI) throws Exception { URL url = null; HttpURLConnection conn = null; try { // 客户端请求原始URL System.out.println(requestURI); // 根据实际情况,转向到别一个服务器中 url = new URL("http://127.0.0.1:8080/HessianDemos/HelloServlet"); System.out.println("转向到:" + url); conn = (HttpURLConnection) url.openConnection(); conn.setRequestProperty("Content-Type", "x-application/hessian"); conn.setDoOutput(true); conn.setRequestMethod("POST"); OutputStream ros = conn.getOutputStream(); byte[] buff = new byte[1024 * 64]; int length; while ((length = is.read(buff)) > 0) { ros.write(buff, 0, length); } ros.flush(); ros.close(); InputStream ris = conn.getInputStream(); while ((length = ris.read(buff)) > 0) { os.write(buff, 0, length); } ris.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (conn != null) conn.disconnect(); } } }
配置如下:
<servlet> <servlet-name>ForwardHelloServlet</servlet-name> <servlet-class>com.mengya.hessian.ForwardHessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>com.mengya.imple.HelloImple</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>com.mengya.inter.IHello</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ForwardHelloServlet</servlet-name> <url-pattern>/ForwardHelloServlet</url-pattern> </servlet-mapping>
客户端测试代码:
public class ForwardHelloTest { public static void main(String[] args) { // 服务器访问路径 String url = "http://127.0.0.1:8080/HessianDemos/ForwardHelloServlet"; HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); try { // IHello是客户端的接口,与服务器接口一致(客户端的语言包括:Java,Objective C,Flex 等) IHello iHello = (IHello) hessianProxyFactory.create(IHello.class, url); // 客户端调服务器的接口实现 System.out.println("Result == " + iHello.sayHello()); } catch (MalformedURLException e) { e.printStackTrace(); } } }
相关推荐
在本"**Hessian Demo**"中,包含了服务端和客户端的示例代码,旨在帮助开发者快速理解和应用Hessian。 首先,我们来了解**Hessian服务端**的工作原理。服务端通常会暴露一个或多个接口,这些接口定义了可供客户端...
在本项目中,我们探讨的是基于C#实现的Hessian服务端和客户端,已经在IIS环境下进行了测试并成功通过。 1. **Hessian协议**:Hessian是由Caucho公司开发的一种轻量级、高效的二进制协议,主要用于Web服务。它支持...
在Android应用中,Hessian被用来实现客户端与服务器之间的通信,特别是处理数据请求和响应。 在“Hessian android客户端异步请求访问包”中,我们关注的核心是异步请求。在Android上,由于UI线程是负责渲染界面和...
Hessian是一种二进制Web服务协议,它提供了一种高效的RPC(远程过程调用)机制,使得服务器和客户端之间能够进行快速、简单的通信。在Java环境中,Hessian库被广泛用于构建分布式应用,因为它可以将Java对象序列化为...
Hessian是一种二进制Web...这个压缩包可能包含了服务器和客户端的代码实现,帮助开发者了解和学习如何在实际项目中应用Hessian。通过研究这些文件,你可以掌握如何设置和调用Hessian服务,以及如何优化网络通信效率。
通过这个示例,你可以深入理解如何在Java环境中搭建和使用Hessian服务,以及如何在客户端进行远程调用,这对于理解和应用RPC技术是非常有价值的。同时,这也展示了Hessian在实现高效、轻量级的分布式系统中的潜力。
下面将详细介绍 Hessian 请求报文和应答报文的结构和格式。 一、Hessian 请求报文结构 Hessian 请求报文结构主要由四部分组成:魔数字、消息头、方法名、参数列表。 1. 魔数字:magic number,用于标识 Hessian ...
7. **实际应用**:在"Test3"、"PyDome1"和"Test1"这些文件中,可能包含了实际的代码示例或者测试用例,展示了如何在Java和Python中设置Hessian服务和客户端,以及如何进行调用。通过这些例子,开发者可以深入理解...
《Hessian应用详解》 Hessian,一种轻量级的二进制协议,因其高效、简单的特点,在分布式服务中被广泛应用。它允许开发者在HTTP上透明地调用远程方法,就像是本地方法调用一样,极大地提高了开发效率和系统性能。...
- 在服务消费者端,你需要创建一个服务引用,使用`@Reference`注解,指定服务接口和版本,Dubbo会根据配置自动从注册中心获取服务提供者的地址。 - 注意,消费者端并不需要直接处理HTTP请求,Dubbo会处理底层通信...
在IT行业中,Hessian是一种轻量级的远程过程调用(RPC)协议,它使得服务端的方法可以直接在客户端被调用,仿佛它们就在本地一样。Hessian基于HTTP协议,使用二进制编码,以提高传输效率和性能。而Spring框架是Java...
本示例着重介绍如何在Spring和SpringMVC框架中集成Hessian RPC,以实现客户端和服务端的通信。 Hessian是一种轻量级的二进制Web服务协议,由Caucho公司开发。它具有较高的传输效率,支持Java和.NET等多种语言,特别...
5. **Android客户端实现**:在Android应用中,首先需要创建一个HessianProxyFactory实例,然后配置服务端URL,通过这个工厂实例获取到服务接口的代理对象。调用这个代理对象的方法即可执行远程服务端的相应操作。 6...
**Hessian:深入理解与应用** Hessian是一种二进制Web服务协议,它由Caucho Technology公司开发,主要用于提供轻量级、高效的远程方法调用(Remote Method Invocation,RMI)服务。Hessian的目标是简化分布式系统...
5. **创建客户端**:在客户端,我们需要创建一个Hessian代理,指定服务器的URL。这个代理就像是对远程服务的本地引用,可以像调用本地方法一样调用远程方法。 6. **发起请求**:通过Hessian代理调用远程方法,传入...
在IT行业中,Hessian是一种基于二进制协议的RPC(远程过程调用)框架,它使得客户端和服务端之间能够高效地进行数据交换。HessianServer指的是实现Hessian协议的服务端程序,通常用于构建分布式系统,使得不同的应用...
- 客户端通过HTTP请求访问服务端的URL,Hessian库会自动处理网络通信和序列化/反序列化过程。客户端代码无需关心具体的网络细节,只需要像调用本地方法一样调用接口即可。 5. **数据交互**: - 在上述示例中,`...
SpringMVC 和 Hessian 是两种在 Java 开发中常见的技术,它们在构建分布式系统时扮演着重要角色。SpringMVC 是 Spring 框架的一部分,主要用于构建 Web 应用的 MVC(模型-视图-控制器)架构。而 Hessian 是一种轻量...