cxf+spring 权限验证(1)

1 篇文章 0 订阅
1 篇文章 0 订阅

最近在学习webservice,根据网上搜集和自己的实践,整理一下.

刚开始学, 代码或者逻辑可能有问题, 希望大家多多指点.

在服务端用的是cxf+spring,客户端通过wsdl2java生成, 用main调用.

1 服务端代码 见代码;

java代码

import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class AuthIntercepter extends AbstractPhaseInterceptor<SoapMessage>{
	public AuthIntercepter() {
		super(Phase.PRE_INVOKE);
	}
	public void handleMessage(SoapMessage soapMsg) throws Fault {
		System.out.println("------------------------------------------");
		List headers = soapMsg.getHeaders();
		if(headers == null || headers.size()<1) {
			throw new Fault(new IllegalArgumentException("no header"));
		}
		
		Header header = (Header) headers.get(0);
		Element ele = (Element)header.getObject();
		NodeList namenodes = ele.getElementsByTagName("username");
		NodeList pwdnodes = ele.getElementsByTagName("password");
		if(namenodes.getLength()<1 || pwdnodes.getLength()<1) {
			throw new Fault(new IllegalArgumentException("用户名/密码不正确"));
		}
		
		String pwd = pwdnodes.item(0).getTextContent();
		String username = namenodes.item(0).getTextContent();
		if("admin".equals(pwd) && "admin".equals(username)) {
			System.out.println("authority passed");
		} else {
			throw new Fault(new IllegalArgumentException("用户名或密码不正确"));  
		}
		
		
	}
	
} 



@WebService
public interface IUserService {
	public User getUserById(@WebParam(name="id")String id);
	public String getUsername(@WebParam(name="id")String id);
}
public class UserServiceImpl implements IUserService {

	//private HibernateDao dao = new HibernateDaoImpl();
	public User getUserById(String id) {
		User user = new User();
		user.setUserName("11111121");
		return user;
	}
	
	public String getUsername(@WebParam(name="id")String id) {
		return "12312312";
	}
}


2 cxf 和spring配置;


spring

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:cxf="http://cxf.apache.org/core"
	xsi:schemaLocation="http://www.springframework.org/schema/beans   
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
    http://cxf.apache.org/jaxws   
    http://cxf.apache.org/schemas/jaxws.xsd">

	<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

	<bean id="userSer" class="com.test.cxf.service.impl.UserServiceImpl" />
	<bean id="inMessageInterceptor" class="com.test.cxf.intercepter.AuthIntercepter">
	</bean>
	<bean id="outLoggingInterceptor" class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
	<!-- address="/userService",就是访问的WebService的name -->
	<jaxws:server id="userService"
		serviceClass="com.test.cxf.service.impl.UserServiceImpl" address="/userService">
		<jaxws:serviceBean>
			<ref bean="userSer" />
		</jaxws:serviceBean>
		<jaxws:inInterceptors>
			<ref bean="inMessageInterceptor" />
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<ref bean="outLoggingInterceptor" />
		</jaxws:outInterceptors>
	</jaxws:server>
</beans>  

xml
<context-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>/WEB-INF/config/applicationContext.xml</param-value>
  	</context-param>
  	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
  
  <servlet>
  	<servlet-name>CXFServlet</servlet-name>
  	<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  	<servlet-name>CXFServlet</servlet-name>
  	<url-pattern>/services/*</url-pattern>
  </servlet-mapping>


3 启动tomcat  在浏览器地址栏输入http://localhost:8080/webservice/services/userService?wsdl 


4创建一客户端项目, 通过myeclipse生成客户端代码;

服务项目上右键-->run as-->Run Configurations..., 在弹出的对话框中找到 Java Application 右键new,name我这里是wsdl2java,点search 输入wsdl2java,找到org.apache.cxf.tools.wsdlto.WSDLToJava,点击ok。勾选include system.....那个。点main右侧的argument:program argument中输入
http://localhost:8080/webservice/services/userService?wsdl, 在下面working directory中选新建的客户端项目. 点apply-->run。这时刷新客户端项目就会看到客户端代码,可能位置不对, 手动移动到src下。



5客户端代码


客户端拦截器

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddAuthIntercepter extends AbstractSoapInterceptor {

	public AddAuthIntercepter() {
		super(Phase.WRITE);
	}

	public void handleMessage(SoapMessage message) throws Fault {
		System.out.println("=============");
		String pwd = "admin";
		String name = "admin";
		QName qname = new QName("RequestSOAPHeader");
		Document doc = DOMUtils.createDocument();
		Element nameEle = doc.createElement("username");
		nameEle.setTextContent(name);
		Element pwdEle = doc.createElement("password");
		pwdEle.setTextContent(pwd);
		Element root = doc.createElementNS("","tns:RequestSOAPHeader");
		root.appendChild(nameEle);
		root.appendChild(pwdEle);
		SoapHeader head = new SoapHeader(qname, root);
		List<Header> headers = message.getHeaders();
		headers.add(head);
	}
}



测试main
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
UserServiceImplService fac = new UserServiceImplService();
		IUserService us = fac.getUserServiceImplPort();
		Client client = ClientProxy.getClient(us);
		client.getOutInterceptors().add(new AddAuthIntercepter());
		User user = us.getUserById("33");
		System.out.println(user.getUserName());


代码可能有缺陷希望大家指出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值