xfire+Sping+安全认证

xfire+spring+安全认证 简单入门(本人参考了https://www.ibm.com/developerworks/cn/java/j-lo-xfire/http://www.blogjava.net/fastzch/archive/2008/01/03/172535.html两片文章)

其他的东西可以上网上随便搜一片看看下面贴上我的代码(下面的代码可在我的资料里面下载点击打开链接

服务端

首先xml中加上下面的代码

<!-- begin XFire 配置 -->
	<servlet>
		<!-- 配合Spring容器中XFire一起工作的Servlet-->
		<servlet-name>xfireServlet</servlet-name>
		<servlet-class>
			org.codehaus.xfire.spring.XFireSpringServlet
		</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>xfireServlet</servlet-name>
		<!-- 在这个URI下开放Web Service服务 -->
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>xfireServlet</servlet-name>
		<!-- 在这个URI下开放Web Service服务 -->
		<url-pattern>/servlet/xfireServlet/*</url-pattern>
	</servlet-mapping>

Service接口:

package com;

import java.util.List;

public interface WebService {
	public String hellow(String name);//字符串类型
	public Student getStudent();//对象类型
	public List<Student> getList();//集合类型
}

Service实现类

package com;

import java.util.ArrayList;
import java.util.List;

public class WebServiceImp implements WebService {

	public String hellow(String name) {
		return name + " say hellow!";
	}

	public Student getStudent() {
		return new Student(1, "mdc", 23);
	}

	public List<Student> getList() {
		List<Student> list = new ArrayList<Student>();
		for (int i = 0; i < 5; i++) {
			Student student = new Student(i + 1, "a" + (i + 1), i + 1);
			list.add(student);
		}
		return list;
	}

}

在Spring配置文件(applicationContext.xml)中加上如下内容

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>

	<import resource="classpath:org/codehaus/xfire/spring/xfire.xml" />
	<bean id="HelloBean" class="com.WebServiceImp" />
	<!-- 定义访问的url-->
     
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="urlMap">             
            <map>                 
               <entry key="/helloService.ws">                  
                   <ref bean="HelloWorldService" />                 
               </entry>             
            </map>         
        </property>     
     </bean>     
	
	<!-- 使用XFire导出器 -->
	<bean id="baseWebService"
		class="org.codehaus.xfire.spring.remoting.XFireExporter"
		lazy-init="false" abstract="true">
		<!-- 引用xfire.xml中定义的工厂 -->
		<property name="serviceFactory" ref="xfire.serviceFactory" />
		<!-- 引用xfire.xml中的xfire实例 -->
		<property name="xfire" ref="xfire" />
		<!-- 安全验证 -->
		<property name="inHandlers" ref="AuthenticationHandler"></property>
	</bean>
	<bean id="HelloWorldService" parent="baseWebService">
		<!-- 业务服务bean -->
		<property name="serviceBean" ref="HelloBean" />
		<!-- 业务服务bean的窄接口类 -->
		<property name="serviceClass" value="com.WebService" />
	</bean>
	<!-- 安全认证 -->
	<bean id="AuthenticationHandler" class="com.AuthenticationHandler"></bean>

</beans>
定义一个Student实体类目的实现客户端能接收服务端的对象

package com;

public class Student {
	private int id;
	private String name;
	private int age;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public Student(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}

	public Student() {
	}
}

服务端的安全认证

package com;

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

public class AuthenticationHandler extends AbstractHandler {

	public void invoke(MessageContext cfx) throws Exception {
		if (cfx.getInMessage().getHeader() == null) {//是否有验证信息
			throw new org.codehaus.xfire.fault.XFireFault("请求必须包含验证信息",
					org.codehaus.xfire.fault.XFireFault.SENDER);
		}
		Element token = cfx.getInMessage().getHeader().getChild(
				"AuthenticationToken");//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 {
			// 进行身份验证 ,只有test@test的用户为授权用户
			if (username.equals("test") && password.equals("test"))
				System.out.println("身份验证通过");
			else
				throw new Exception();
		} catch (Exception e) {
			throw new org.codehaus.xfire.fault.XFireFault("非法的用户名和密码",
					org.codehaus.xfire.fault.XFireFault.SENDER);
		}
	}

}

最终的目录结构

发布一下输入:http://localhost:8080/xFireServiceServer/services/webService访问一下

到这里服务端已完成下面看客户端

(1)实体student跟服务端的一样,接口ServiceTest与上面的WebService一样。

(2)GetServiceBean类里面有一个静态方法用来访问服务端。

(3)安全认证类ClientPasswordHandler

(4)测试类Test

package com;

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
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.ObjectServiceFactory;

public class GetServiceBean {

	private static XFireProxyFactory factory = new XFireProxyFactory();

	@SuppressWarnings("unchecked")
	public static Object getBean(String serviceUrl, Class serviceClass) throws MalformedURLException {
		Service serviceModel = new ObjectServiceFactory().create(serviceClass);
		Object obj= factory.create(serviceModel, serviceUrl);
		Client client=((XFireProxy)Proxy.getInvocationHandler(obj)).getClient(); //获取访问服务的客户端
	    client.addOutHandler(new ClientPasswordHandler("test","test"));//添加流模型和DOM
	    return obj;
	}

}

package com;

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

@SuppressWarnings("unchecked")
public class ClientPasswordHandler extends AbstractHandler {
	private String username = null;
	private String password = null;

	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;
	}

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

	public void invoke(MessageContext context) throws Exception {
		// 为SOAP Header构造验证信息
		Element el = new Element("header");//标头
		context.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);
	}

}

package com;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			ServiceTest service = (ServiceTest) GetServiceBean
					.getBean(
							"http://localhost:8080/xFireServiceServer/services/WebService",
							ServiceTest.class);
			System.out.println(service.hellow("mdc"));//字符串类型
			Student student = new Student();
			student = service.getStudent();//对象类型
			System.out.println("id:" + student.getId() + " name:"
					+ student.getName() + " age:" + student.getAge());
			List<Student> students = new ArrayList<Student>();
			students = service.getList();//集合类型
			for (int i = 0; i < students.size(); i++) {
				Student stu = students.get(i);
				System.out.println("id:" + stu.getId() + " name:"
						+ stu.getName() + " age:" + stu.getAge());
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

最终目录

测试结果




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值