下面文章详细说明了java怎么发布和调用一个webservice接口进行项目之间的数据交互。
文章地址:java使用XFire组件开发WebService入门实例
本文介绍 带验证的接口请求 :
webservice不可能暴漏在公网上任意供别人调用,需要在服务端加入一定的验证措施。
webservice 服务端代码:
services.xml 代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
<name>HelloWebService</name>
<serviceClass>
com.sdjz.webservice.IHelloWebService
</serviceClass>
<implementationClass>
com.sdjz.webservice.HelloWebServiceImpl
</implementationClass>
<!--注册监听处理器-->
<inHandlers>
<handler handlerClass="com.sdjz.webservice.checkclient.ClientAuthenticationHandler"></handler>
</inHandlers>
<style>wrapped</style>
<use>literal</use>
<scope>application</scope>
</service></beans>
接口HelloWebService
package com.sdjz.webservice;
//Generated by MyEclipse
public interface IHelloWebService {
/**
* example
* @param message
* @return
*/
public String example(String message);
}
接口实现HelloWebServiceImpl
package com.sdjz.webservice;
//Generated by MyEclipse
public class HelloWebServiceImpl implements IHelloWebService {
public String example(String message) {
return "Webservice server 返回的信息:"+message;
}
}
接口请求前的验证 ClientAuthenticationHandler
package com.sdjz.webservice.checkclient;
import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.exchange.InMessage;
import org.codehaus.xfire.fault.XFireFault;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;
/**
* XFire的回调的Handler,在XFire配置文件中配置
* Server端的认证模块,回调处理模块
*
* ClientAuthHandler跟ClientAuthenticationHandler要一起用,或者都不用
*
* @author Administrator
*
*
*/
public class ClientAuthenticationHandler extends AbstractHandler {
private static final Logger log = Logger.getLogger(ClientAuthenticationHandler.class);
public void invoke(MessageContext context) throws Exception {
log.info("#AuthenticationHandler is invoked");
if (context.getInMessage().getHeader() == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
Element token = context.getInMessage().getHeader().getChild(
"AuthenticationToken");
if (token == null) {
throw new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息",
org.codehaus.xfire.fault.XFireFault.SENDER);
}
String username = token.getChild("Username").getValue();
String password = token.getChild("Password").getValue();
/**
* 检查用户名密码是否正确
*/
PasswordAuthenticationManager pamanager=new PasswordAuthenticationManager();
if(!pamanager.authenticate(username,password))
throw new XFireFault("Authentication Fail! Check username/password",
XFireFault.SENDER);
}
}
用户名密码校验器(有数据库表可以写业务方法进行校验)
package com.sdjz.webservice.checkclient;
/**
* 密码验证器
* @author Administrator
*
*/
public class PasswordAuthenticationManager {
public boolean authenticate(String username,String password){
boolean flag=false;
if("QQ908044593".equals(username)&&"908044593".equals(password)){
flag=true;
}
return flag;
}
}
********************************************以上是服务端代码*********************************************
webservice Client 代码
客户端认校验代码
package com.bean;
import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
/**
* 客户端端的认证模块,回调处理模块
* 每个需要认证的WebService方法都可以挂这个Handler
*
* 仅用于Demo,从解耦和易用性出发,
* 没有跟Acegi结合,你可以任意扩展
* 默认用户名/密码是QQ908044593/908044593
*
* ClientAuthHandler跟ClientAuthenticationHandler要一起用,或者都不用
*
* @author Administrator
*
*
*/
public class ClientAuthHandler extends AbstractHandler {
private static final Logger log = Logger.getLogger(ClientAuthHandler.class);
private String username;
private String password;
public void invoke(MessageContext arg0) throws Exception {
Element el = new Element("header");
arg0.getOutMessage().setHeader(el);
Element auth = new Element("AuthenticationToken");
Element username_el = new Element("Username");
username_el.addContent(username);
Element password_el = new Element("Password");
password_el.addContent(password);
auth.addContent(username_el);
auth.addContent(password_el);
el.addContent(auth);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
客户端请求接口代码
package com.sdjz.webserviceclient;
import java.net.MalformedURLException;
import java.net.URL;
import org.codehaus.xfire.client.Client;
import com.bean.ClientAuthHandler;
public class WSClient {
public static void main(String[] args) throws MalformedURLException, Exception{
//最简单的demo
// Client client = new Client(
// new URL(
// "http://localhost:9080/WebServiceServer/services/HelloWebService?wsdl"));
// Object[] result = client.invoke("example",new Object[] { "web Hello World!" });
// System.out.println(result[0]);
//加入验证头信息
Client client = new Client(
new URL(
"http://127.0.0.1:9080/WebServiceServer/services/HelloWebService?wsdl"));
ClientAuthHandler wscname = new ClientAuthHandler();
wscname.setUsername("QQ908044593");
wscname.setPassword("908044593");
client.addOutHandler(wscname);
Object[] result = client.invoke("example",new Object[] { "Hello World!11" });
System.out.println(result[0]);
}
}
这样 就完成了 带验证的webservice接口实例。