单点登陆、webservice(cxf,axis)

来源:互联网 发布:sql server check约束 编辑:程序博客网 时间:2024/05/22 01:42

 以前不知道何为单点登陆,原来其定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

为了保持数据的一致性且减小工作量,我们决定在A系统调用B系统中的方法,此时就需要首先从A系统单点登陆到B系统中才能调用。

最近我在两个系统之间写了个接口,虽然两个系统都用JAVA编写,但所用的JDK,Tomcat的版本不同,A系统用的是JDK1.6,B系统用的是JDK1.4。最开始在A系统用CXF写好服务端,在B系统也用CXF写好客户端,测试通过了。后来才知道B系统用的是JDK1.4,但CXF貌似不支持JDK1.4,在网上查说axis1.0支持JDK1.4,最后客户端改成axis1.0。

由于之前CXF,AXIS都未用过,没少折腾。

 

 CXF构建webservice程序的大致流程如下:

首先下载cxf包,目前最新的版本是apache-cxf-2.1.,下栽地址http://cxf.apache.org/download.html。

参考JAR包

commons-logging-1.1.jargeronimo-activation_1.1_spec-1.0-M1.jar (or Sun's Activation jar)geronimo-annotation_1.0_spec-1.1.jar (JSR 250)geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)geronimo-servlet_2.5_spec-1.1-M1.jar (or Sun's Servlet jar)geronimo-ws-metadata_2.0_spec-1.1.1.jar (JSR 181)jaxb-api-2.1.jarjaxb-impl-2.1.6.jarjaxws-api-2.1.jarjetty-6.1.5.jarjetty-util-6.1.5.jarneethi-2.0.jarsaaj-api-1.3.jarsaaj-impl-1.3.jarstax-api-1.0.1.jarwsdl4j-1.6.1.jarwstx-asl-3.2.1.jarXmlSchema-1.2.jarxml-resolver-1.2.jar

The Spring jars (optional - for XML Configuration support):

aopalliance-1.0.jarspring-core-2.0.4.jarspring-beans-2.0.4.jarspring-context-2.0.4.jarspring-web-2.0.4.jar

And the CXF jar:

cxf-2.1.jar

 

1.在web.xml加载CXF

<servlet-name>CXFServlet</servlet-name>
   <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  </servlet>

<servlet-mapping>
    <servlet-name>CXFServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>

 

2.编写java接口,和接口的实现

import java.text.ParseException;
import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;

import com.thunisoft.fy.gxpt.server.webservice.bean.FyqqRespInfo;

@WebService(name="IFyqqRespService")
public interface IFyqqRespService {

 public String getRespXML(@WebParam(name="cbr")String cbr) throws ParseException;

}

实现省略。。。。

 

3.创建beans.xml文件【当然需要在web.xml文件中加载此文件】,里面配置接口的实现类

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:jaxws="http://cxf.apache.org/jaxws"
 xsi:schemaLocation="
      http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
      http://cxf.apache.org/jaxws  http://cxf.apache.org/schemas/jaxws.xsd">
 <!-- CXF webservice配置 -->
 <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" /> 
 <!-- 
 <jaxws:endpoint   
      id="fyqqResp"   
      implementor="com.test.fy.gxpt.server.webservice.service.impl.FyqqRespServiceImpl"   
      address="/messageServiceWS" >
    </jaxws:endpoint>
 -->
 <jaxws:server serviceClass="com.test.fy.gxpt.server.webservice.service.IFyqqRespService" address="/messageServiceWS">
    <jaxws:serviceBean>
        <ref bean="fyqqRespService"/>
    </jaxws:serviceBean>
    <jaxws:inInterceptors> 
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /> 
  </jaxws:inInterceptors>
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
        </jaxws:outInterceptors>
 </jaxws:server> 
</beans>

 【CXF配置文件有上面两种配置方式,一个同事在采用第一种配置方式时在同一工程中调用时没有问题,但在不同工程调用时webservice的服务端反射的DAO一直是null,不知什么原因?有知道的可以指点下。因此最好采用下面的配置方式】

这三个步骤完成了,就可以通过http://localhost:8080/Project/services/messageServiceWS?wsdl可以访问wsdl文档

 

CXF开发webservice客户端【jar包可以参照服务端】:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  
  factory.getInInterceptors().add(new LoggingInInterceptor());
  factory.getOutInterceptors().add(new LoggingOutInterceptor());
  factory.setServiceClass(IFyqqRespService.class);
  factory.setAddress("http://192.16.12.157:8080/server/services/messageServiceWS");
  IFyqqRespService service = (IFyqqRespService) factory.create();

String str = service.getRespXML(cbr);

 

Axis1开发webservice客户端:

 

Service service = new Service();
  Call call = (Call) service.createCall();
  call.setTargetEndpointAddress(new java.net.URL(("http://192.16.12.157:8080/server/services/messageServiceWS"));

call.setOperationName(method);// WSDL里面描述的操作名称
  call.addParameter("cbr", org.apache.axis.encoding.XMLType.XSD_STRING,javax.xml.rpc.ParameterMode.IN);// 操作的参数

 call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);
   call.setUseSOAPAction(true);// 给方法传递参数,并且调用方法
   String str = (String) call.invoke(new Object[] {cbr+""});

 

我只把返回String 的弄成功了,返回类型为List的有待研究