微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

XFire实现身份验证(基于Xfire SOAP Header的WebService安全验证)

[java]  view plain copy
  1. 一、创建web services 工程(XFire),和平时的一样。  
  2. 二、加入身份验证功能  
  3. 1、首先编写服务端验证类,继承AbstractHandler类  
  4. package test;  
  5. import org.codehaus.xfire.MessageContext;  
  6. import org.codehaus.xfire.handler.AbstractHandler;  
  7. import org.jdom.Element;  
  8.   
  9. public class AuthenticationHandler extends AbstractHandler {  
  10. void invoke(MessageContext cfx) throws Exception {  
  11.    if (cfx.getInMessage().getHeader() == null) {  
  12.     throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",  
  13.       org.codehaus.xfire.fault.XFireFault.SENDER);  
  14.    }  
  15.    Element token = cfx.getInMessage().getHeader().getChild(  
  16.      "AuthenticationToken");  
  17. if (token == new org.codehaus.xfire.fault.XFireFault("请求必须包含身份验证信息",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">    String username = token.getChild("Username").getValue();  
  18.    String password = token.getChild("Password").getValue();  
  19.    try {  
  20.     // 进行身份验证 ,只有abcd@1234的用户为授权用户  
  21. if (username.equals("abcd") && password.equals("1234"))  
  22.      // 这语句不显示  
  23.      System.out.println("身份验证通过");  
  24.     else  
  25.      new Exception();  
  26.    } catch (Exception e) {  
  27. new org.codehaus.xfire.fault.XFireFault("非法的用户名密码",248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> }  
  28. }  
  29. 2、Client构造授权信息  
  30. package test;  
  31. import org.codehaus.xfire.MessageContext;  
  32. import org.codehaus.xfire.handler.AbstractHandler;  
  33. import org.jdom.Element;  
  34.   
  35. class ClientAuthenticationHandler extends AbstractHandler {  
  36. private String username = null;  
  37. private String password = public ClientAuthenticationHandler() {   
  38.     }  
  39. public ClientAuthenticationHandler(String username,String password) {   
  40. this.username = username;   
  41.         this.password = password;  
  42.     }  
  43. void setUsername(String username) {   
  44. this.username = username;   
  45. void setPassword(String password) {   
  46. this.password = password;   
  47. void invoke(MessageContext context) throws Exception {  
  48.         //为SOAP Header构造验证信息  
  49.         Element el = new Element("header");   
  50.         context.getoutMessage().setHeader(el);   
  51.         Element auth = new Element("AuthenticationToken");   
  52.         Element username_el = new Element("Username");   
  53.         username_el.addContent(username);   
  54.         Element password_el = new Element("Password");   
  55.         password_el.addContent(password);   
  56.         auth.addContent(username_el);   
  57.         auth.addContent(password_el);   
  58.         el.addContent(auth);   
  59.     }   
  60. 3修改services.xml为web services绑定Handler  
  61. <?xml version="1.0" encoding="UTF-8"?>  
  62. <beans xmlns="http://xfire.codehaus.org/config/1.0">  
  63. <service xmlns="http://xfire.codehaus.org/config/1.0">  
  64.    <name>Hello</name>  
  65.    <namespace>http://test/HelloService</namespace>  
  66.    <serviceClass>test.IHello</serviceClass>  
  67.    <implementationClass>test.HelloImpl</implementationClass>  
  68.    <inHandlers>   
  69.    <handler handlerClass ="test.AuthenticationHandler" ></handler >   
  70.    </inHandlers>  
  71.    <style>wrapped</style>  
  72.    <use>literal</use>  
  73.    <scope>application</scope>  
  74. </service>  
  75. </beans>  
  76. 4、新建一个类ClientTest,用来测试  
  77. import java.lang.reflect.Proxy;  
  78. import java.net.MalformedURLException;  
  79. import org.codehaus.xfire.client.*;  
  80. import org.codehaus.xfire.service.Service;  
  81. import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
  82. class ClientTest {  
  83. /** 
  84. * @param args 
  85. */  
  86. static void main(String[] args) {  
  87.    // Todo Auto-generated method stub  
  88. try {  
  89.     Service serviceModel = new ObjectServiceFactory().create(IHello.class);  
  90.     IHello service = (IHello) new XFireProxyFactory().create(serviceModel,  
  91.         "http://dracom-d1514b82:8080/web_services3/services/Hello");     
  92.     XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);  
  93.     Client client = proxy.getClient();  
  94. //发送授权信息  
  95.     client.addOutHandler(new ClientAuthenticationHandler("abcd","1234"));  
  96. //输出调用web services方法的返回信息  
  97.     System.out.println(service.getMessage("你好aaa"));  
  98. catch (MalformedURLException e) {  
  99.     // Todo Auto-generated catch block  
  100.     e.printstacktrace();  
  101.    } catch (IllegalArgumentException e) {  
  102. // Todo Auto-generated catch block  
  103.     e.printstacktrace();  
  104.    }  
  105. 三、这样我们就完成了编码,下面启动web services,运行客户端代码,本文为abcd@1234位授权用户,  
  106. 使用abcd@1234,可以正常访问web services,如果用错误帐号,则会有以下异常:  
  107. Exception in thread "main" org.codehaus.xfire.XFireRuntimeException: Could not invoke service.. nested exception is org.codehaus.xfire.fault.XFireFault: 非法的用户名密码  
  108. org.codehaus.xfire.fault.XFireFault: 非法的用户名密码  
  109. at org.codehaus.xfire.fault.soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)  
  110. at org.codehaus.xfire.fault.soapFaultSerializer.readMessage(SoapFaultSerializer.java:28)  
  111. at org.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)  
  112. at org.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)  
  113. at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)  
  114. at org.codehaus.xfire.client.Client.onReceive(Client.java:406)  
  115. at org.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)  
  116. at org.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)  
  117. at org.codehaus.xfire.handler.OutMessageSender.invoke(OutMessageSender.java:26)  
  118. at org.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)  
  119. at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:79)  
  120. at org.codehaus.xfire.client.Invocation.invoke(Invocation.java:114)  
  121. at org.codehaus.xfire.client.Client.invoke(Client.java:336)  
  122. at org.codehaus.xfire.client.XFireProxy.handleRequest(XFireProxy.java:77)  
  123. at org.codehaus.xfire.client.XFireProxy.invoke(XFireProxy.java:57)  
  124. at $Proxy0.getMessage(UnkNown Source)  
  125. at test.ClientTest.main(ClientTest.java:24)  
  126. 如果不在CientTest加以下Heade则会有以下异常:  
  127. new ClientAuthenticationHandler("abcd1",108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important"> 信息: Fault occurred!  
  128. org.codehaus.xfire.fault.XFireFault: 请求必须包含验证信息  
  129. at test.AuthenticationHandler.invoke(AuthenticationHandler.java:11)  
  130. at org.codehaus.xfire.transport.DefaultEndpoint.onReceive(DefaultEndpoint.java:64)  
  131. at org.codehaus.xfire.transport.AbstractChannel.receive(AbstractChannel.java:38)  
  132. at org.codehaus.xfire.transport.http.XFireServletController.invoke(XFireServletController.java:304)  
  133. at org.codehaus.xfire.transport.http.XFireServletController.doService(XFireServletController.java:129)  
  134. at org.codehaus.xfire.transport.http.XFireServlet.doPost(XFireServlet.java:116)  
  135. at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)  
  136. at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)  
  137. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)  
  138. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)  
  139. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)  
  140. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)  
  141. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)  
  142. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)  
  143. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)  
  144. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)  
  145. at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)  
  146. at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)  
  147. at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)  
  148. at java.lang.Thread.run(Thread.java:619)  

原文链接:http://www.josdoc.com/html/Webkaifa/XFire/shenruyanjiu/200904/29-314.html

相关文章:http://hi.baidu.com/dd_taiyangxue/blog/item/f133623e6796b9ce7d1e71af.html

http://javaoldboy.iteye.com/blog/306510

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐