`

XML_RPC用户验证实例(高级)

阅读更多
Server端:
创建一个web工程,工程名XML_RPC,导入除client以外的4个jar包

业务逻辑类:
package demo.xmlrpc.action;

public class Calculator {
    public int add(int i1, int i2) {
            return i1 + i2;
    }
    public int subtract(int i1, int i2) {
            return i1 - i2;
    }
}


用户验证逻辑类:
package demo.xmlrpc.authentication;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.XmlRpcRequest;
import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
import org.apache.xmlrpc.webserver.XmlRpcServlet;

public class MyServlet extends XmlRpcServlet {
	private static final long serialVersionUID = 1L;

	private boolean isAuthenticated(String pUserName, String pPassword) {
		return "foo".equals(pUserName) && "bar".equals(pPassword);
	}

	protected XmlRpcHandlerMapping newXmlRpcHandlerMapping() throws XmlRpcException {
		PropertyHandlerMapping mapping = (PropertyHandlerMapping) super
				.newXmlRpcHandlerMapping();
		
		AbstractReflectiveHandlerMapping.AuthenticationHandler handler = new AbstractReflectiveHandlerMapping.AuthenticationHandler() {
			public boolean isAuthorized(XmlRpcRequest pRequest) {
				XmlRpcHttpRequestConfig config = (XmlRpcHttpRequestConfig) pRequest
						.getConfig();
				return isAuthenticated(config.getBasicUserName(), config
						.getBasicPassword());
			};
		};
		mapping.setAuthenticationHandler(handler);
		return mapping;
	}
}


服务控制Servlet:

package demo.xmlrpc.authentication;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.webserver.XmlRpcServletServer;

import demo.xmlrpc.action.Calculator;
import demo.xmlrpc.action.HelloHandlerImpl;

public class MyAuthenticationServlet extends MyServlet{

	private static final long serialVersionUID = 1L;

	private XmlRpcServletServer server;

    public void init(ServletConfig pConfig) throws ServletException {
          super.init(pConfig);
          try {
                // 创建一个XmlRpcServletServer对象
                server = new XmlRpcServletServer();
                
                // 创建一个接收器并映射到XmlRpcServletServer对象
                PropertyHandlerMapping phm =(PropertyHandlerMapping)newXmlRpcHandlerMapping();
                phm.addHandler("HelloHandler", HelloHandlerImpl.class);
                phm.addHandler("Calculator", Calculator.class);
              
                server.setHandlerMapping(phm);
                // 更多XmlRpcServletServer对象设置 
                XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl)server.getConfig();
                serverConfig.setEnabledForExtensions(true);
                serverConfig.setContentLengthOptional(false);
          } catch (XmlRpcException e) {
                try {
                      log("Failed to create XmlRpcServer: " + e.getMessage(), e);
                } catch (Throwable ignore) {
                }
                throw new ServletException(e);
          }
    }

    public void doPost(HttpServletRequest pRequest, HttpServletResponse pResponse)
          throws IOException, ServletException {
          server.execute(pRequest, pResponse);
    }

}


在web.xml文件添加如下内容:

  	<servlet>
		<servlet-name>Authentication</servlet-name>
		<servlet-class>demo.xmlrpc.authentication.MyAuthenticationServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Authentication</servlet-name>
		<url-pattern>/Authentication</url-pattern>
	</servlet-mapping>



创建一个包,里面添加一个配置文件,名字如下。两个名字一定不能变,这很雷人的,

框架规定的。

包名:org.apache.xmlrpc.webserver

文件名为:XmlRpcServlet.properties

文件内容为:Calculator=demo.xmlrpc.action.Calculator

Client端:
创建一个普通工程,导入除server以外的4个jar包

远程客户端调用类:
package demo.xmlrpc;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Vector;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public class Client1 {

	public static void main(String[] args) {

		try {
			// 客户端配置对象,并且设置用户名密码
			XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
			config.setBasicUserName("foo");
			config.setBasicPassword("bar");
			config.setServerURL(new URL("http://192.168.1.217:8080/XML_RPC/Authentication"));

			//创建一个XmlRpcClient对象,并给它绑定一个配置对象
			XmlRpcClient client = new XmlRpcClient();
			client.setConfig(config);
			
			// 创建参数集合
			Vector<Integer> params= new Vector<Integer>();
			params.addElement(3);
			params.addElement(8);
			Integer result=(Integer)client.execute("Calculator.add",params);

			System.out.println(result);

		} catch (MalformedURLException e) {
			System.out.println(e.toString());
		} catch (XmlRpcException e) {
			System.out.println(e.toString());
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}


部署启动Server端的web工程,运行Client端的程序。返回结果为11。





1
4
分享到:
评论

相关推荐

    xml_rpc需要的jar包

    它提供了对HTTP协议的高级支持,如连接管理、重试策略、身份验证等,使得XML-RPC客户端可以更稳定、更安全地与远程服务器进行交互。 在使用这些库进行XML-RPC开发时,通常会遵循以下步骤: 1. **服务器端**:创建...

    2001_Programming Web Services with XML-RPC

    列举了一些公共可用的XML-RPC服务实例,供开发者参考。 ##### 6.3 设计考虑 讨论了设计XML-RPC应用时需要注意的关键因素。 ##### 6.4 超越XML-RPC 展望了XML-RPC之外的其他Web服务技术及其发展方向。 ##### 6.5...

    xml-rpc.net.2.1.0.rar

    2. 创建XML-RPC客户端实例,配置服务器地址。 3. 使用客户端调用远程方法,传入参数。 4. 处理返回的结果,可能是一个对象、数组或其他复杂类型。 5. 在服务器端,创建XML-RPC服务类,标记可调用的方法。 6. 配置...

    j-jaxrpc_code.zip_RPC Client Java_jax

    **JAX-RPC:Java API for XML-based Remote Procedure Calls** JAX-RPC(Java API for XML-based Remote Procedure Calls)是Java平台上的一个标准接口,它允许开发者创建和使用基于XML的远程过程调用(RPC)服务。...

    apache xml rpc client

    - 创建XML-RPC客户端实例,如:`XmlRpcClientConfig config = new XmlRpcClientConfigImpl(); config.setServerURL(serverUrl);` - 使用`XmlRpcClient`类创建客户端对象并调用远程方法,例如:`XmlRpcClient ...

    RPC 实例,RPC实例

    例如,protobuf、gRPC中的.proto文件,或者XML-RPC的XML结构。接口定义包括服务名、方法名、参数类型和返回类型。 2. **序列化与反序列化**:RPC调用涉及的数据需要在网络上传输,因此必须进行序列化,将对象转换...

    XML_ppt 内含教程ppt和详细学习资料

    1. **XML基础**:XML是一种自定义的标记语言,允许用户根据需求创建自己的标签。它遵循严格的语法规则,如元素必须正确关闭,属性值需用引号包围等。 2. **文档结构**:XML文档由根元素包围,所有其他元素都包含在...

    java XML-PRC 类库

    Java XML-RPC(Remote Procedure Call)类库是一种在分布式环境中实现客户端和服务器间通信的技术,尤其适用于基于XML的数据交换。这个技术允许Java应用程序通过HTTP协议调用远程服务器上的方法,就像调用本地方法...

    XML高级编程pdf

    5.3 使用DOM和XML的应用实例 5.3.1 简单的客户端实例 5.3.2 更复杂的编程实例 5.4 DOM和XML的未来 5.4.1 W3C的工作 5.4.2 应用 5.4.3 数据库、模式和DOM 5.5 小结 第6章 SAX 1.0: XML简易API 6.1 事件驱动...

    XML 高级编程(高清版)

    5.3 使用DOM和XML的应用实例 5.3.1 简单的客户端实例 5.3.2 更复杂的编程实例 5.4 DOM和XML的未来 5.4.1 W3C的工作 5.4.2 应用 5.4.3 数据库、模式和DOM 5.5 小结 第6章 SAX 1.0: XML简易API 6.1 事件驱动...

    XML高级编程 (Extensible Markup Language)

    5.3 使用DOM和XML的应用实例 5.3.1 简单的客户端实例 5.3.2 更复杂的编程实例 5.4 DOM和XML的未来 5.4.1 W3C的工作 5.4.2 应用 5.4.3 数据库、模式和DOM 5.5 小结 第6章 SAX 1.0: XML简易API 6.1 事件驱动...

    Java RPC调用示例

    Java RPC(Remote Procedure Call)调用是分布式系统中常见的通信方式,它允许一个程序在不关心远程系统具体实现的情况下调用另一个网络上的程序。在这个Java RPC调用示例中,我们将探讨RPC的基本概念、实现机制以及...

    python3-xmlrpc-ssl-basic-auth:具有SSL和基本身份验证的线程化Python 3 XML RPC服务器

    总结来说,"python3-xmlrpc-ssl-basic-auth"项目提供了一个安全的Python 3 XML RPC服务器实现,它结合了SSL加密和基本身份验证,确保了通信的安全性和服务的可靠性。对于需要在Python 3环境中搭建安全RPC服务的...

    RPC实例demo

    6. **运行测试**:启动服务器,通过客户端调用远程方法,验证RPC调用是否能够正确执行并返回预期结果。 通过这个实例,我们可以学习到如何搭建一个简单的RPC服务,包括服务的定义、实现、客户端的调用以及通信协议...

    XML入门经典(Begining XML) 第5版 源代码

    XML(eXtensible Markup Language)是一种用于标记数据的语言,其设计目的是传输和存储数据,而非显示数据。...这不仅有助于你提升XML处理能力,也有利于你理解其他基于XML的技术,如XML数据库、XML-RPC等。

    前端项目-jquery-xmlrpc.zip

    - 内容提交:用户在前端填写表单后,通过XML-RPC将数据提交到服务器存储。 通过学习和理解这个项目,开发者可以了解到如何在前端利用jQuery和XML-RPC技术进行高效的远程数据交互,这对于开发交互丰富的Web应用非常...

    java rpc_demo

    这个“java rpc_demo”项目显然是一个用于演示RPC基本概念和实现的实例。现在我们来深入探讨RPC以及如何通过这个“demo.rpc”文件来理解和学习它。 首先,我们需要理解RPC的基本工作原理。RPC使得客户端能够透明地...

    利用XMLBean轻轻松松读写XML

    这个工具不仅提供了基本的XML操作,还包含了一些高级特性,如XPath支持、XML Schema验证等。通过研究源码,开发者可以更好地理解和定制XMLBean的功能。 7. **应用场景** XMLBean常用于企业级应用,如服务端的数据...

    XML网页制作实作教程源码

    XML(Extensible Markup Language)是一种标记语言,它用于存储、传输和表示数据。与HTML不同,HTML主要用于...同时,对XML的深入学习也有助于理解和开发更高级的技术,如XML数据库、XML-RPC和XML-based配置文件等。

Global site tag (gtag.js) - Google Analytics