xifire webservice 接口 带头信息安全验证的实例

本文介绍了Java使用XFire组件开发WebService接口的实现过程,包括服务端代码配置、接口定义、实现及请求前的验证模块。通过示例展示了如何在服务端加入验证措施以保护接口不被任意调用,并提供了客户端认证代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

下面文章详细说明了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接口实例。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

prefectjava

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值