• Spring+Hessian搭建远程方法调用


    1、hessian调用分为服务端和客户端

    2、总体图

    3、服务端配置

    (1)web.xml

    <!-- hessian 配置  默认会加载hessian-servlet.xml-->
        <servlet>
            <servlet-name>hessian</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>hessian</servlet-name>
            <url-pattern>/hessian/*</url-pattern>
        </servlet-mapping>
        <!-- hessian 配置 -->

    (2)Interface

    public interface WebHessianService {
        void test();
    }

    (3)Implement

    @Service("webHessianService")
    public class WebHessianServiceImpl implements WebHessianService {
    
        public void test(){
              system.out.println();
        }
    }

    (4)HessianServerProxyExporter:

    Servlet-API-based HTTP request handler that exports the specified service bean as Hessian service endpoint, accessible via a Hessian proxy.
    public class HessianServerProxyExporter extends HessianServiceExporter {
        private static Logger logger = LoggerFactory.getLogger(HessianServerProxyExporter.class);
        PropertyUtil propertyUtil = PropertyUtil.getInstance("project");
        public String hessianAuth;
    
        public HessianServerProxyExporter() {
            this.hessianAuth = this.propertyUtil.getProperty("hessianAuth");
        }
    
        public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            logger.info("++++ hessian request clientIp:" + request.getRemoteAddr() + "++++requestData:" + request.getRequestURL());
            String auth = request.getHeader("hessianAuth");
            if(auth != null && auth.equalsIgnoreCase(this.hessianAuth)) {
                super.handleRequest(request, response);
            } else {
                logger.info("+++++hessianAuth->fail :" + request.getRemoteAddr() + "," + request.getRequestURL());
            }
        }
    }
    (5)ServiceBean
     <!--  Hessian访问路径 含权限认证 -->
        <bean name="/webHessian" class="com.qysxy.hessian.server.HessianServerProxyExporter">
            <property name="service" ref="webHessianService"/>
            <property name="serviceInterface">
                <value>
                    com.qysxy.framework.hessian.WebHessianService
                </value>
            </property>
        </bean>

     4、客户端配置

    (1)HessianClientProxyFactory   :hessian客户端代理

    public class HessianClientProxyFactory extends HessianProxyFactory {
        PropertyUtil propertyUtil = PropertyUtil.getInstance("project");
        private final String hessianAuth;
    
        public HessianClientProxyFactory() {
            this.hessianAuth = this.propertyUtil.getProperty("hessianAuth");
        }
    
        protected URLConnection openConnection(URL url) throws IOException {
            URLConnection conn = super.openConnection(url);
            conn.setRequestProperty("hessianAuth", this.hessianAuth);
            return conn;
        }
    }

    (2)Interface

    public interface WebHessianService {
        void test();
    }

    (3)clientBean:

        <bean id="webHessianService"
            class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
            <property name="serviceInterface"
                value="com.qysxy.framework.hessian.service.WebHessianService"></property>
            <property name="serviceUrl">
                <value>${hessianPath}/hessian/webHessian</value>
            </property>
            <property name="readTimeout">
                <value>100000</value>
            </property>
            <property name="proxyFactory">
                <bean
                    class="com.*.hessian.client.HessianClientProxyFactory" />
            </property>
            <property name="chunkedPost" value="false" />
        </bean>

    5、测试

     @Test
        public void hessian() {
            String url = "http://127.0.0.1/hessian/webHessian";
            HessianClientProxyFactory  factory = new HessianClientProxyFactory();
            try {
                WebHessianService service = (WebHessianService) factory.create(WebHessianService.class, url);
               service.test();
                System.err.println("map=" + map.toString());
            } catch (MalformedURLException e) {
                e.printStackTrace();
            }
        }

     6、总结:

    服务端是需要定义方法接口并且实现方法,利用servlet和spring的拦截器控制访问;

    客户端可以用bean组件定义好调用方法接口、访问URL、hessian代理工厂

  • 相关阅读:
    vue通过webpack打包后怎么运行
    vue中请求本地的json数据
    electron打包成桌面应用程序的详细介绍
    Web应用架构-Services
    Web应用架构-Full-text Search Service
    Web应用架构-Job Queue & Servers
    Web应用架构-Caching Service
    Web应用架构-Database
    设计模式:设计模式概述&JDK中的应用
    常见面试问题总结
  • 原文地址:https://www.cnblogs.com/yuan951/p/6708792.html
Copyright © 2020-2023  润新知