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"