关键字: webservices xfire
XFire提供了四种身份验证的方式,分别是http验证,JSR181,Handler验证,WS-Security。
SOAP的原理告诉我们一个WS交互的流程是客户端发送请求->服务器接收请求->服务器发送数据->客户端接收数据,handler可以让我们在这四个操作中之前进行编码,所以,我们的验证进行在客户端发送请求和服务器接收请求的时候,因此,我们要写两个handler,然后把它们装配上就可以了。
Handler验证方式如下:
主要参考的实例是XFIREdemo中的BOOK
服务器的代码如下
package com.nstar.xfire.auth;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.XFireRuntimeException;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;
public class XfireAuthenticationHandler extends AbstractHandler {
private static final String USERNAME = "biansutao";
private static final String PASSWORD = "12345678";
private static final String NS = "http://xfire.codehaus.org/biansutao";
public void invoke(MessageContext ctx) throws Exception {
// Check if header exists
Element header = ctx.getInMessage().getHeader();
if (header == null) {
throw new XFireRuntimeException("Missing SOAP Header");
}
// Does it have version tag
Element name = header.getChild("USERNAME",Namespace.getNamespace(NS));
Element pass = header.getChild("PASSWORD",Namespace.getNamespace(NS));
if(name.getValue().equals(USERNAME) && pass.getValue().equals(PASSWORD)){
System.out.println("验证通过");
}
else{
System.out.println("验证未通过");
throw new XFireRuntimeException("Authentication Failure");
}
ctx.setProperty("USERNAME", USERNAME);
ctx.setProperty("PASSWORD", PASSWORD);
}
}
然后需要在services.xml中配置如下:
xml 代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWordService</name>
<serviceClass>com.nstar.xfire.IHelloWordService</serviceClass>
<implementationClass>
com.nstar.xfire.HelloWordServiceImpl
</implementationClass>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
<inHandlers>
<handler handlerClass="com.nstar.xfire.auth.XfireAuthenticationHandler"></handler>
</inHandlers>
</service>
</beans>
客户端代码
package com.nstar.xfire.client.auth;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
public class ClientHeaderHandler extends AbstractHandler {
//用户验证
private static final String USERNAME = "biansutao";
private static final String PASSWORD = "12345678";
private static final String NS = "http://xfire.codehaus.org/biansutao";
public void invoke(MessageContext ctx) throws Exception {
Element header = ctx.getOutMessage().getOrCreateHeader();
header.addContent(new Element("USERNAME",NS).addContent(USERNAME));
header.addContent(new Element("PASSWORD",NS).addContent(PASSWORD));
}
}
package com.nstar.xfire.client;
import java.util.List;
import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.ArrayList;
import org.codehaus.xfire.*;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import com.nstar.xfire.IHelloWordService;
import com.nstar.xfire.Student;
import com.nstar.xfire.client.auth.ClientHeaderHandler;
public class HelloWorldClient {
/**
* @param args
*/
public static void main(String[] args) {
Service serviceModel = new ObjectServiceFactory().create(IHelloWordService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String url = "http://10.232.75.61:8090/Xfire/services/HelloWordService";
try {
IHelloWordService service = (IHelloWordService) factory.create(serviceModel, url);
XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
Client client = proxy.getClient();
client.addOutHandler(new ClientHeaderHandler());
List list = new ArrayList();
List list1 = new ArrayList();
list.add(new String("测试"));
int age = service.getAge("边苏涛");
String name = service.getName(1);
Student s = service.getOneStudent(27);
list1 = service.getStudent(list);
System.out.println("边苏涛's age =="+age);
System.out.println("学号为1的学生姓名 "+name);
System.out.println("age == "+s.getAge()+" name == "+s.getName()+" list content "+s.getList().get(0).toString());
System.out.println(list1.size());
for(int i=0;i<list1.size();i++){
System.out.println(list1.get(i).toString());
}
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
这样一来,使用这个原理就可以针对特定用户进行服务调用了。
示例代码:
服务器端:
客户端:
分享到:
相关推荐
"xfire+spring+安全认证"的主题聚焦于如何利用XFire和Spring框架来实现安全的Web服务。XFire是一个用于创建、消费和部署SOAP Web服务的Java库,而Spring框架则是一个广泛使用的全功能应用开发框架,提供了包括安全性...
1. 认证:确保每次请求都包含有效的API密钥。 2. API限制:大多数API都有调用频率限制,避免过于频繁的请求以免触发限制。 3. 错误处理:处理可能出现的错误响应,如无效请求、超时或服务器错误。 4. 数据安全:保护...
xfire1.2.6是早年间一个流行的开源SOAP服务框架,它允许开发者构建和消费Web服务。WS-Security(Web Services Security)是基于SOAP消息的安全标准,用于保护Web服务免受各种攻击,如篡改、伪造等。在这个示例中,...
9. **安全性**:对于涉及到敏感数据或认证的Web服务,XFire也提供了安全特性,如SSL/TLS加密、WS-Security等,以保护通信的安全。 10. **持续集成与部署**:在开发完成后,XFire生成的客户端代码可以被包含在应用的...
6. **安全性**:作为一款涉及用户数据的应用,Xfire必须重视安全措施,包括数据加密、防止DDoS攻击、用户认证和授权机制。 7. **负载均衡**:随着用户数量的增长,Xfire可能部署了多个web服务器实例,通过负载均衡...
2. **配置文件**:客户端代码可能包含XML配置文件,用于存储Web服务的URL、认证信息、端口等参数,便于配置和管理。 3. **HTTP/HTTPS通信模块**:由于Web服务通常基于HTTP或HTTPS协议,因此客户端代码需要有相应的...
2. **设置认证和配置**:如果Web服务需要身份验证或其他特定的HTTP头信息,可以在代理类实例化时设置。 3. **调用服务方法**:通过代理对象调用Web服务提供的方法,传入相应的参数。 4. **处理响应**:服务方法的...
7. **安全与认证**:XFire支持多种安全模型,如基本认证、Digest认证和WS-Security,可以保护你的Web服务免受未经授权的访问。 8. **扩展性**:XFire允许你添加自定义行为、数据绑定和序列化机制,以适应特定的业务...
首先,开发者需要进行API的注册和授权,获取必要的API密钥,以便于后续的请求认证。然后,通过HTTP请求,开发者可以调用各种API接口来获取用户信息,如用户名、头像、在线状态等,或者操作好友列表,添加、删除好友...
6. **安全控制**:Spring的安全框架可以与XFire集成,提供认证和授权机制。例如,可以使用Spring Security(原Acegi)来保护Web服务,确保只有经过身份验证的用户才能访问。 7. **异常处理**:Spring的异常翻译功能...
5. 配置文件:如client-config.xml,用于配置Web服务的地址、认证信息等。 6. 客户端工具:如命令行工具或图形界面工具,帮助用户测试和调试Web服务。 在实际开发中,将这个XFire客户端JAR添加到项目的类路径中,...
- **配置传输机制**:设置HTTP或HTTPS等传输方式,以及必要的认证信息。 - **调用服务**:通过代理对象调用Web服务的方法,传递参数并获取响应。 4. **配置与依赖管理** 在大型项目中,通常会使用构建工具如...
2. 初始化代理:在调用服务之前,需要初始化代理,通常包括设置服务地址和任何必要的认证信息。 3. 调用服务方法:通过代理类的对象调用Web服务的方法,传入参数并获取返回值。 4. 处理结果:服务调用完成后,解析...
在Web服务客户端开发中,通常需要处理的问题包括:错误处理、事务管理、安全认证、性能优化等。Spring XFire提供了一套完整的机制来处理这些复杂性,使得开发者可以专注于业务逻辑,而不是底层的通信细节。 至于...