最近在学习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());