xifire webservice 接口 带头信息安全验证的实例
发布时间:2020-12-16 23:54:27 所属栏目:安全 来源:网络整理
导读:下面文章详细说明了java怎么发布和调用一个webservice接口进行项目之间的数据交互。 文章地址:java使用XFire组件开发WebService入门实例 本文介绍 带验证的接口请求 : webservice不可能暴漏在公网上任意供别人调用,需要在服务端加入一定的验证措施。 webs
下面文章详细说明了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("QQ809044093".equals(username)&&"809044093".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结合,你可以任意扩展 * 默认用户名/密码是QQ809044093/809044093 * * 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("QQ809044093"); wscname.setPassword("809044093"); client.addOutHandler(wscname); Object[] result = client.invoke("example",new Object[] { "Hello World!11" }); System.out.println(result[0]); } }这样 就完成了 带验证的webservice接口实例。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |