XFire 中使用 Authentication

 XFire 中使用 Authentication

 官方例子http://xfire.codehaus.org/Authentication

 Marc Dumontier's Weblog:http://www.jroller.com/hexbinary/date/20051130

 

1.配置服務端

2.配置客戶端

 

1.配置服務端

  1.1.創建ws  接口

 接口:

   package com.cn.test;

   public interface ITest {
   
    public String sayTest(String param);

}

 

實現類:

package com.cn.test;

public class TestImpl implements ITest{
   
    public String sayTest(String param){
        return param+" test !!";
    }

}

 

擴展類:

package com.cn.test;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.fault.XFireFault;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

public class AuthenticationHandler extends AbstractHandler{
   
    public static final String NS = "http://test.cn.com";

    public void invoke(MessageContext context) throws XFireFault {
       
        if(context.getInMessage().getHeader()==null){
            throw new XFireFault("must include account",XFireFault.SENDER);
        }
       
        Element token = context.getInMessage().getHeader().getChild("AuthenticationToken",Namespace.getNamespace(NS));
       
        if(token==null){
            throw new XFireFault("token is null",XFireFault.SENDER);
        }
       
        String username = token.getChild("Username",Namespace.getNamespace(NS)).getText();
        String password = token.getChild("Password",Namespace.getNamespace(NS)).getText();
       
        try{
            if(username.equals("test")){
                System.out.println("username is test!!");
            }
        }catch(Exception e){
            throw new XFireFault("Authentication Failed...",XFireFault.SENDER);
        }
       
    }

  1.2.配置web.xml

  <servlet>
    <servlet-name>XFireServlet</servlet-name>
    <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

  <servlet-mapping>
    <servlet-name>XFireServlet</servlet-name>
    <url-pattern>/servlet/XFireServlet/*</url-pattern>
  </servlet-mapping>

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/appContext.xml
        </param-value>
    </context-param>
 
  <!-- spring framework -->
    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>

 

1.3.配置spring

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
    "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
  <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>
 
  <bean id="testImpl" class="com.cn.test.TestImpl"/>
  <bean id="authenticationHandler" class="com.cn.test.AuthenticationHandler"/>
  <bean id="test" class="org.codehaus.xfire.spring.ServiceBean">
      <property name="serviceBean" ref="testImpl"/>
      <property name="serviceClass" value="com.cn.test.ITest"/>
      <property name="inHandlers">
          <list>
              <ref bean="authenticationHandler"/>
          </list>
      </property>
  </bean>
</beans>

 

服務端配置完畢。主要是在inHandlers 加入authenticationHandler 驗證帳號密碼

 

2.客戶端

擴展AbstractHandler,OutHandler

package test;

import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.jdom.Element;
import org.jdom.Namespace;

public class ClientAuthenticationHandler extends AbstractHandler{
   
    private String username = null;
    private String password = null;


    public ClientAuthenticationHandler() {
    }

    public ClientAuthenticationHandler(String username,String password) {
        this.username = username;
        this.password = password;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void invoke(MessageContext context) throws Exception {
        final Namespace ns = Namespace.getNamespace("http://test.cn.com");
        Element el = new Element("header",ns);
        context.getOutMessage().setHeader(el);

        Element auth = new Element("AuthenticationToken", ns);
        Element username_el = new Element("Username",ns);
        username_el.addContent(username);
        Element password_el = new Element("Password",ns);
        password_el.addContent(password);
        auth.addContent(username_el);
        auth.addContent(password_el);
        el.addContent(auth);
       
    }

 

測試類:

package test;

import java.net.URL;

import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.transport.Channel;

public class TestMain {

    public static void main(String[] args) throws Exception{
        Client client = new Client(new URL("http://127.0.0.1:8080/asxf/services/ITest?wsdl"));
        client.addOutHandler(new ClientAuthenticationHandler("test","test"));
        Object[] results = client.invoke("sayTest", new Object[] {"test invoke"});
        System.out.println(results[0]);

    }

 

需要主要的是Namespace.getNamespace("http://test.cn.com"),服務端和客戶端要一致

這個參考wsdl裏面的targetNamespace="http://test.cn.com"

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章