文章搜索:
【点击打包该文章】
用Xfire开发webservice心得最近公司里面要求为家校通开发一个短信接口,所以一直再忙这个webservice,刚开始的想法,是通过用apache公司的httpClient来保持用户之间的数据同步,并测试已经成功,后来想想,如果出现什么意外的话,比如:两个服务器中有一个服务器停止服务了,就会导致对方的数据不是同步的,很难做到及时,后来就一直再搞axis,发现这个东西不是很好用,而且网上的资料太残缺了,搞的我几近崩溃,但是还是不行,后来发现axis好像不能传递List 没办法只好转向例外一种框架xfire这个东西可以说很好用,可以传递所有复杂的对象,好了,废话少说,开始动工介绍,我开发的项目实例吧~ ---_--- 首先,我们就开始讲解怎样实现一个webservice,在讲解,怎样用xfire进行用户的权限验证。OK,let GO 整个项目在XfireWebService.rar,这里本来是要用spring+hibernate+xfire后来觉得没什么意思,用spring也就用到IOC和AOP的简单运用,现在这项目的构架是hibernate + xfire 首先要注意的是五个文件:services.xml,web.xml, IxfireExample.java, XfireExampleImpl.java,IxfireExample.aegis.xml 这里主要是注意这些,首先我们一个一个的讲解, Services.xml的配置如下: TGpsMoinfo http://org/johnny/zlkj/service/TGpsMoinfo org.johnny.zlkj.service.IXfireExample org.johnny.zlkj.service.impl.XfireExampleImpl 这里特别要注意的是:namespace不要搞错了,其余的配置就相当简单了,我就不多说了还有下面有一个配置 这个东西目前可以却掉,是用进行用户验证的东东~ 好next Web.xml 要应用xfire肯定要在web.xml中配置咯。不然这个框架怎么启动呢,呵呵~ 还是吧,web.xml粘贴过来吧, XFireServlet org.codehaus.xfire.transport.http.XFireConfigurableServlet 0 XFireServlet /services/* XFireServlet /servlet/XFireServlet/* index.jsp 上面的东西我就不在多啰嗦了,有什么疑问,可以直接加我QQ问我^_^ IxfireExample.java的代码如下,其实这里就是定义一下接口,但是我们这里用了list对性,还有一个JAVA返回值对象,所以我们应该进行相关的配置~ 这些配置就在如下xml中进行相关配置~ IxfireExample.aegis.xml 它的相关配置,如下,如果没有配置的话将会找不到 org.johnny.zlkj.po.TGpsMoinfo 如果不是String类型的返回值,都需要进行相关的配置~ XfireExampleImpl.java主要是对IxfireExampleImpl的实现,大致的xfire就到这里为止了 由于webservice是暴露再外面的方法,任何人都可以对相关方法进行调用,所以我们要对webservice进行相关的权限控制,具体实施如下: 主要涉及到的类有如下:服务端两步曲: AuthorTiCationHander.java ,再加上上面的 配置就OK了~ package org.johnny.zlkj.service; import org.codehaus.xfire.MessageContext; import org.codehaus.xfire.handler.AbstractHandler; import org.jdom.Element; public class AuthorTiCationHander extends AbstractHandler { public void invoke(MessageContext arg0) throws Exception { if(arg0.getInMessage().getHeader() == null) { throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",org.codehaus.xfire.fault.XFireFault.SENDER); } Element token=arg0.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(); try { //进行身份验证 ,只有abcd@1234的用户为授权用户 if(username.equals("abcd") && password.equals("11234")) //这语句不显示 System.out.println("身份验证通过"); else throw new Exception(); } catch (Exception e) { throw new org.codehaus.xfire.fault.XFireFault("非法的用户名和密码", org.codehaus.xfire.fault.XFireFault.SENDER); } } } ClientAuthenticationHandler.java 而客户端的相关配置如下: package org.johnny.zlkj.test; import org.codehaus.xfire.MessageContext; import org.codehaus.xfire.handler.AbstractHandler; import org.jdom.Element; public class ClientAuthenticationHandler extends AbstractHandler { private String username = null; private String password = null; public ClientAuthenticationHandler(String username,String password){ this.username=username; this.password=password; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } 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); } } 相关的,想到我少发了300快钱工资我就郁闷~ package org.johnny.zlkj.test; import java.lang.reflect.Proxy; import java.net.MalformedURLException; import java.util.List; import org.codehaus.xfire.XFireFactory; 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.ObjectServ