java web应用如何实现单点登录
实现方式一:父域 Cookie
实现方式二:认证中心
实现方式三:LocalStorage 跨域
补充:域名分级
在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或 Token ),并要求客户端在之后的每次请求中携带它们。在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 Session 的 ID 或 Token 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。
单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。
单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session,比如可以将 Session 序列化到 Redis 中,让多个应用系统共享同一个 Redis,直接读取 Redis 来获取 Session。
当然仅此是不够的,因为不同的应用系统有着不同的域名,尽管 Session 共享了,但是由于 Session ID 是往往保存在浏览器 Cookie 中的,因此存在作用域的限制,无法跨域名传递,也就是说当用户在 app1com 中登录后,Session ID 仅在浏览器访问 app1com 时才会自动在请求头中携带,而当浏览器访问 app2com 时,Session ID 是不会被带过去的。实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
实现方式一:父域 Cookie
在将具体实现之前,我们先来聊一聊 Cookie 的作用域。
Cookie 的作用域由 domain 属性和 path 属性共同决定。domain 属性的有效值为当前域或其父域的域名/IP地址,在 Tomcat 中,domain 属性默认为当前域的域名/IP地址。path 属性的有效值是以“/”开头的路径,在 Tomcat 中,path 属性默认为当前 Web 应用的上下文路径。
如果将 Cookie 的 domain 属性设置为当前域的父域,那么就认为它是父域 Cookie。Cookie 有一个特点,即父域中的 Cookie 被子域所共享,换言之,子域会自动继承父域中的Cookie。
利用 Cookie 的这个特点,不难想到,将 Session ID(或 Token)保存到父域中不就行了。没错,我们只需要将 Cookie 的 domain 属性设置为父域的域名(主域名),同时将 Cookie 的 path 属性设置为根路径,这样所有的子域应用就都可以访问到这个 Cookie 了。不过这要求应用系统的域名需建立在一个共同的主域名之下,如 tiebabaiducom 和 mapbaiducom,它们都建立在 baiducom 这个主域名之下,那么它们就可以通过这种方式来实现单点登录。
总结:此种实现方式比较简单,但不支持跨主域名。
实现方式二:认证中心
我们可以部署一个认证中心,认证中心就是一个专门负责处理登录请求的独立的 Web 服务。
用户统一在认证中心进行登录,登录成功后,认证中心记录用户的登录状态,并将 Token 写入 Cookie。(注意这个 Cookie 是认证中心的,应用系统是访问不到的。)
应用系统检查当前请求有没有 Token,如果没有,说明用户在当前系统中尚未登录,那么就将页面跳转至认证中心。由于这个操作会将认证中心的 Cookie 自动带过去,因此,认证中心能够根据 Cookie 知道用户是否已经登录过了。如果认证中心发现用户尚未登录,则返回登录页面,等待用户登录,如果发现用户已经登录过了,就不会让用户再次登录了,而是会跳转回目标 URL ,并在跳转前生成一个 Token,拼接在目标 URL 的后面,回传给目标应用系统。
应用系统拿到 Token 之后,还需要向认证中心确认下 Token 的合法性,防止用户伪造。确认无误后,应用系统记录用户的登录状态,并将 Token 写入 Cookie,然后给本次访问放行。(注意这个 Cookie 是当前应用系统的,其他应用系统是访问不到的。)当用户再次访问当前应用系统时,就会自动带上这个 Token,应用系统验证 Token 发现用户已登录,于是就不会有认证中心什么事了。
这里顺便介绍两款认证中心的开源实现:
Apereo CAS 是一个企业级单点登录系统,其中 CAS 的意思是”Central Authentication Service“。它最初是耶鲁大学实验室的项目,后来转让给了 JASIG 组织,项目更名为 JASIG CAS,后来该组织并入了Apereo 基金会,项目也随之更名为 Apereo CAS。
XXL-SSO 是一个简易的单点登录系统,由大众点评工程师许雪里个人开发,代码比较简单,没有做安全控制,因而不推荐直接应用在项目中,这里列出来仅供参考。
总结:此种实现方式相对复杂,支持跨域,扩展性好,是单点登录的标准做法。
实现方式三:LocalStorage 跨域
前面,我们说实现单点登录的关键在于,如何让 Session ID(或 Token)在多个域中共享。
父域 Cookie 确实是一种不错的解决方案,但是不支持跨域。那么有没有什么奇*技巧能够让 Cookie 跨域传递呢?
很遗憾,浏览器对 Cookie 的跨域限制越来越严格。Chrome 浏览器还给 Cookie 新增了一个 SameSite 属性,此举几乎禁止了一切跨域请求的 Cookie 传递(超链接除外),并且只有当使用 HTTPs 协议时,才有可能被允许在 AJAX 跨域请求中接受服务器传来的 Cookie。
不过,在前后端分离的情况下,完全可以不使用 Cookie,我们可以选择将 Session ID (或 Token )保存到浏览器的 LocalStorage 中,让前端在每次向后端发送请求时,主动将 LocalStorage 的数据传递给服务端。这些都是由前端来控制的,后端需要做的仅仅是在用户登录成功后,将 Session ID (或 Token )放在响应体中传递给前端。
在这样的场景下,单点登录完全可以在前端实现。前端拿到 Session ID (或 Token )后,除了将它写入自己的 LocalStorage 中之外,还可以通过特殊手段将它写入多个其他域下的 LocalStorage 中。
————————————————
版权声明:本文为CSDN博主「风水道人」的原创文章,遵循CC 40 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blogcsdnnet/jcmj123456/article/details/114296482
前端通过 iframe+postMessage() 方式,将同一份 Token 写入到了多个域下的 LocalStorage 中,前端每次在向后端发送请求之前,都会主动从 LocalStorage 中读取 Token 并在请求中携带,这样就实现了同一份 Token 被多个域所共享。
总结:此种实现方式完全由前端控制,几乎不需要后端参与,同样支持跨域。
补充:域名分级
从专业的角度来说(根据《计算机网络》中的定义),com、cn 为一级域名(也称顶级域名),comcn、baiducom 为二级域名,sinacomcn、tiebabaiducom 为三级域名,以此类推,N 级域名就是 N-1 级域名的直接子域名。
从使用者的角度来说,一般把可支持独立备案的主域名称作一级域名,如 baiducom、sinacomcn 皆可称作一级域名,在主域名下建立的直接子域名称作二级域名,如 tiebabaiducom 为二级域名。
Web Services以XML作为数据交换的标准格式,它是跨平台的应用,允许以任何方式创建Web Services,在NET、Java平台上访问。
在Java平台创建和访问Web Service多通过Axis完成。Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的。在使用Axis访问Web Service时,需要引入以下包(10个):axis-antjar、axisjar、commons-discovery-02jar、commons-logging-104jar、jaxrpcjar、log4j-128jar、saajjar、wsdl4j-151jar、activation-11jar和mail-14jar。
(1)访问Java创建的Web Service
在当前Java客户端应用中添加相应的10个Axis包,编写客户端程序:
import orgapacheaxisclientCall;
import orgapacheaxisclientService;
public class Test {
public static void main(String[] args) throws Exception {
try{
String endpoint = "http://localhost:8080/MyService/services/Hello";
Service service = new Service();
Call call = (Call)servicecreateCall();
callsetTargetEndpointAddress(new javanetURL(endpoint));
callsetOperationName("getHello");
String res = (String) callinvoke(new Object[]{});
Systemoutprintln(res);
}
catch (Exception ex){
exprintStackTrace();
}
}
}
其中两处代码加粗,第一处表示引用Java Web Service的URL,第二处表示公共的方法名称。
1首先说一下两个开发webservices的工具包:axis 和XFire 本人首先接触的是axis。
两者比较如下:
相对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。
知道了这两个框架你研究起来也就不难了。
下面我就基于xfire说一下开发说明:
xfire对WebServices的开发非常方便,在Eclipse里开发就更方便了。总结起来有这么几点:
1编写类,跟普通JAVABEAN没什么区别。
2配置文件
如果是要深层次的去理解WebServices还需努力,下面是我给你找的一个网上的例子作为参考:
使用XFire+Spring构建Web Service
XFire是与Axis 2并列的新一代Web Service框架,通过提供简单的API支持Web Service各项标准协议,帮助你方便快速地开发Web Service应用。
相 对于Axis来说,目前XFire相对受欢迎,加上其提供了和Spring集成的支持,在目前的Web Service开源社区拥有众多的追随者。并且因为XFire为Spring提供的支持,使得我们可以很容易在Spring中使用XFire构建Web Service应用。
XFire与Axis2相比具有如下特征:
l 支持一系列Web Service的新标准--JSR181、WSDL20 、JAXB2、WS-Security等;
l 使用Stax解释XML,性能有了质的提高。XFire采用Woodstox 作Stax实现;
l 容易上手,可以方便快速地从pojo发布服务;
l 支持Spring、Pico、Plexus、Loom等容器;
l 灵活的Binding机制,包括默认的Aegis,xmlbeans,jaxb2,castor;
l 高性能的SOAP 栈设计;
l 支持Spring、Pico、Plexus、Loom等容器。
XFire与Axis1性能的比较如下:
l XFire比Axis13快2-6倍;
l XFire的响应时间是Axis13的1/2到1/5。
XFire在WebService框架中开始较晚,它从现有的框架中借鉴了许多优秀的理念,力争将Web Service的应用开发难度降到最低。此外,还提供了各种绑定技术、支持多种传输协议,对WebService体系中许多新的规范提供了支持。
下面让我们来看一个XFire于Spring集成的helloWorld的简单例子。
一.实现的功能和特点
本例具有如下功能和特点:
1) 基于J2EE平台的Web Service服务;
2) 开发方便,配置简单;
3) 与spring无缝集成。
XFire是完全基于流数据处理进行工作的系统,这意味着XFire不是将整个SOAP文档缓存在内存中,而是以管道的方式接收SOAP流数据。这种工作方式的转变带来了可观的性能回报,同时节省了内存的占用。
XFire从 管道中接收一个SOAP请求到返回一个SOAP响应,会经历一系列的阶段。在管道调用的任何一个阶段,XFire都可以添加一些额外的Handler,在 对消息进行加工处理后再传入到下一个阶段中。在SOAP请求消息对Web Service发起真正调用之前,分别会经过传输、预转发、转发、策略实施、用户信息处理、预调用、服务调用等阶段。
二.开发环境
笔者的开发环境描述如下:
1) jdk: 15版本;
2) Tomcat:5520;
3) MyEclipse:511 GA。
三.开发步骤
1 工程与环境的建立
在MyEclipse 中新建Web工程,名为webservice_helloworld。选择该工程后,点击右键选择MyEclipse->Add Web Service Capabilities,弹出Add Web Service Capabilities对话框,点击“Next”,弹出Project Library Configuration对话框,默认选择Core Libraries,点击“Finish”按钮,完成XFire核心包的添加。为了后续的客户端的测试,还需读者加入commons- httpclientjar包到WEB-INF/lib下。
部署后可看到此时WEB-INF/lib的jar包列表如下:
activation-11jar、commons -beanutils-170jar、commons-codec-13jar、commons-httpclientjar、 commons-logging-104jar、jaxen-11-beta-9jar、jaxws-api-20jar、jdom- 10jar、jsr173_api-10jar、mail-14jar、saaj-api-13jar、saaj-impl- 13jar、spring-126jar、stax-api-101jar、wsdl4j-152jar、wstx-asl- 301jar、xbean-210jar、xbean-spring-25jar、xfire-aegis-122jar、 xfire-annotations-122jar、xfire-core-122jar、xfire-java5-122jar、 xfire-jaxws-122jar、xfire-jsr181-api-10-M1jar、xfire-spring- 122jar、XmlSchema-11jar
为了后续的开发和测试,在src目录下分别建立test和webservice目录,分别用于存放测试文件和webservice的相关类。
2.Web Service实现的编写
在本例中,我们只是做一个helloWorld的简单例子。Web Service服务端提供一个根据输入的名字信息回复相应的helloWorld信息的。例如,当名字为“阿蜜果”时,恢复信息为“hello,阿蜜果”。下面让我们一步一步来开始进行编码。
1)webxml的配置
一 般情况下,我们通过HTTP作为Web Service的传输协议,这样我们只需启动一个Web服务器(如Tomcat,在本例中使用的是Tomcat5520),这样客户端就可以通过 HTTP访问到Web Service服务。为了集成Spring容器,XFire专门提供一个XFireSpringServlet,我们可以在webxml中配置该 Servlet,将Spring容器中定义的Web Service在某个URI下发布。
为了能正确使用XFire,需在webxml中进行相应配置,在该文件中配置XFire的servlet和servlet-mapping。同时因为本实例需要将XFire集成到Spring中,因而需要在webxml文件中加载Spring的相应配置文件。在本实例中,我们首先在WEB-INF下建立两个配置Spring配置文件,一个为applicationContextxml,该文件用来定义本工程的bean,一个为xfire-servletxml,用来配置XFire的相关bean。修改后的webxml的内容如下所示:
<xml version="10" encoding="UTF-8">
<web-app xmlns="http://javasuncom/xml/ns/j2ee" xmlns:xsi="http://wwww3org/2001/XMLSchema-instance" version="24" xsi:schemaLocation="http://javasuncom/xml/ns/j2ee http://javasuncom/xml/ns/j2ee/web-app_2_4xsd">
<display-name>XFireService</display-name>
<!-- begin Spring配置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContextxml,/WEB-INF/xfire-servletxml</param-value>
</context-param>
<listener>
<listener-class> orgspringframeworkwebcontextContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class> orgspringframeworkwebutilIntrospectorCleanupListener
</listener-class>
</listener>
<!-- end Spring配置 -->
<!-- begin XFire 配置 -->
<servlet>
<servlet-name>xfire</servlet-name>
<servlet-class>orgspringframeworkwebservletDispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfire</servlet-name>
<url-pattern>ws</url-pattern>
</servlet-mapping>
<servlet>
<!-- 配合Spring容器中XFire一起工作的Servlet-->
<servlet-name>xfireServlet</servlet-name>
<servlet-class>orgcodehausxfirespringXFireSpringServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>xfireServlet</servlet-name>
<!-- 在这个URI下开放Web Service服务 -->
<url-pattern>/service/</url-pattern>
</servlet-mapping>
<!-- end XFire 配置 -->
</web-app>
2)Web Service的接口类HelloWorldjava和对应实现类HelloWorldImpljava
为了用Web Service完成HelloWorld功能,我们首先在src/webservice目录下建立接口类HelloWoldjava。它仅包含一个sayHelloWorld(String name)的方法,其详细内容如下:
package webservice;
/ //
HelloWorld的接口类
/
publicinterface HelloWorld {
/ //
对名字为name的人打招呼
@paramname名字
@return返回打招呼的字符串
/
String sayHelloWorld(String name);
}
我们还需要建立一个对应的实现类,来实现sayHelloWorld的功能,该实现类即为HelloWorldImpljava。该类的详细内容如下:
package webservice;
/ //
HelloWorld的实现类
/
publicclass HelloWorldImpl implements HelloWorld {
public String sayHelloWorld(String name) {
String helloWorld = "hello," + name;
return helloWorld;
}
}
3)Spring配置文件applicationContextxml和xfire-servletxml的配置
首先我们在applicationContextxml文件中配置对应的bean——HelloWorldBean,该xml文件的内容如下:
<xml version="10" encoding="UTF-8">
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://wwwspringframeworkorg/dtd/spring-beansdtd">
<beans>
<bean id="HelloWorldBean" class="webserviceHelloWorldImpl"/>
</beans>
这个配置文件很简单,在此不详述。
XFire为Spring 提供了方便易用的导出器XFireExporter,借助该导出器的支持,我们可以在Spring容器中将一个POJO导出为Web Service。HelloWorld是业务服务类,在此拥有一个sayHelloWorld的方法,我们希望将此方法开放为Web Service。在实际应用中,如果某个类具有众多的方法,而其中的某些方法不需要开放为Web Service的情况下,我们可以定义一个窄接口,该接口中只需定义那些开放为Web Service的业务方法。
将一个业务类所有需要开放为Web Service的方法通过一个窄接口来描述是值得推荐的作法,这让Web Service的接口显得很“干净”。其次,XFire的导出器也需要服务接口的支持,因为它采用基于接口的动态代理技术。
窄接口中的方法在真实的系统中可能需要引用其它的业务类或DAO获取数据库中的真实数据,为了简化实例,我们在此简化了实例。
下面让我们看看在xfire-servletxml文件中导出器的设置,该文件内容如下:
<xml version="10" encoding="UTF-8">
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://wwwspringframeworkorg/dtd/spring-beansdtd">
<beans>
<!-- 引入XFire预配置信息 -->
<import resource="classpath:org/codehaus/xfire/spring/xfirexml" />
<!—定义访问的url-->
<bean class="orgspringframeworkwebservlethandlerSimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="/HelloWorldServicews">
<ref bean="HelloWorldService" />
</entry>
</map>
</property>
</bean>
<!-- 使用XFire导出器 -->
<bean id="baseWebService" class="orgcodehausxfirespringremotingXFireExporter" lazy-init="false" abstract="true">
<!-- 引用xfirexml中定义的工厂 -->
<property name="serviceFactory" ref="xfireserviceFactory" />
<!-- 引用xfirexml中的xfire实例 -->
<property name="xfire" ref="xfire" />
</bean>
<bean id="HelloWorldService" parent="baseWebService">
<!-- 业务服务bean -->
<property name="serviceBean" ref="HelloWorldBean" />
<!-- 业务服务bean的窄接口类 -->
<property name="serviceClass" value="webserviceHelloWorld" />
</bean>
</beans>
在 上面的配置中,我们可以看到,在该配置文件中引入了xfirexml这个Spring配置文件。它是在XFire核心JAR包中拥有一个预定义的 Spring配置文件,它定义了XFire在Spring中必须用到的一些Bean和资源,需要引入这个预定义的配置文件。从该配置文件中可以看出,我们 通过XFireExporter将业务类导出为Web Service,对于任何导出器,我们都需要引入XFire环境,即serviceFactory和xfire,这是标准的配置。ServiceFactory是XFire的核心类,它可以将一个POJO生成为一个Web Service。
在本实例中,我们通过定义一个baseWebService,其余的webService配置都将该bean作为父bean,这样可以简化Spring的配置,不需要多次引入serviceFactory和xfire。
3 Web Service的测试
在上一步操作完成之后,我们的这个简单的Web Service已经编写完毕,下面让我们来看看自己的劳动成果吧。
在浏览器中输入地址:http://localhost:8080/webservice_helloworld/HelloWorldServicewswsdl,我们可以看到HelloWorldService对应的WSDL信息,阅读这个WSDL文档,我们可以知道HelloWorld的sayHelloWorld方法已经被成功地发布为Web Service了。只要拿到这个WSDL就可以开发相应的客户端调用程序了。
XFire为访问服务端Web Service提供了各种方便的方式:我们一般根据服务地址和窄接口类创建客户调用程序。
在不能获得服务窄接口类的情况下,XFire允许我们通过WSDL文件生成客户端调用程序,通过指定服务接口的方式调用服务。
1)通过WSDL文件生成客户端调用程序
首先我们通过http://localhost:8080/webservice_helloworld/HelloWorldServicewswsdl我们可以获得WSDL文件HelloWorldServicewsdl,并将其放在src目录下面,接着我们通过程序访问该WSDL文件,并调用需测试的方法。此时测试类WebServiceClientTestjava的内容如下所示:
package test;
import orgcodehausxfireclientClient;
import orgspringframeworkcoreioClassPathResource;
import orgspringframeworkcoreioResource;
import webserviceHelloWorld;
/ //
Copyright2007GuangZhouAmigo
Allrightreserved
HelloWorld的webservice的测试类
@author<a href="mailto:xiexingxing1121@126com">AmigoXie</a>
@version10
Creationdate:2007-9-16-下午05:36:05
/
publicclass WebServiceClientTest {
HelloWorld helloWorld = null;
publicstaticvoid main(String[] args) throws Exception {
WebServiceClientTest test = new WebServiceClientTest();
testtestClient();
}
publicvoid testClient() throws Exception {
String wsdl = "HelloWorldServicewsdl"; //对应的WSDL文件
Resource resource = new ClassPathResource(wsdl);
Client client = new Client(resourcegetInputStream(), null); //根据WSDL创建客户实例
Object[] objArray = new Object[1];
objArray[0] = "阿蜜果";
//调用特定的Web Service方法
Object[] results = clientinvoke("sayHelloWorld", objArray);
Systemoutprintln("result: " + results[0]);
}
}
运行该类,可得到如下输出结果:
result: hello,阿蜜果
可看出运行结果正确。
2)根据服务地址创建客户端调用程序
接着让我们来看一个根据服务地址创建客户端调用程序的例子。我们可以通过测试类来测试Web Service的正确性,下面让我们来看一个简单的测试类,首先我们在src/test目录建立WebServiceClientTestjava文件,并在src目录下建立客户端调用的Spring配置文件clientxml。在clientxml配置文件中我们定义了一个testWebService的bean,该bean访问wsdlDocumentUrl为http://localhost:8080/webservice_helloworld/HelloWorldServicewswsdl的WSDL。该xml文件的详细内容如下:
<xml version="10" encoding="UTF-8">
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://wwwspringframeworkorg/dtd/spring-beansdtd">
<beans>
<bean id="testWebService" class="orgcodehausxfirespringremotingXFireClientFactoryBean">
<property name="serviceClass">
<value>webserviceHelloWorld</value>
</property>
<property name="wsdlDocumentUrl">
<value>http://localhost:8080/webservice_helloworld/HelloWorldServicewswsdl</value>
</property>
</bean>
</beans>
在WebServiceClientTestjava文件中获得HelloWorld,并调用它的sayHelloWorld方法来完成测试,该类的详细内容如下所示:
package test;
import orgspringframeworkcontextApplicationContext;
import orgspringframeworkcontextsupportClassPathXmlApplicationContext;
import webserviceHelloWorld;
/ //
HelloWorld的webservice的测试类
/
publicclass WebServiceClientTest {
HelloWorld helloWorld = null;
publicstaticvoid main(String[] args) {
WebServiceClientTest test = new WebServiceClientTest();
testtestClient();
}
publicvoid testClient() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"clientxml");
helloWorld = (HelloWorld) ctxgetBean("testWebService");
Systemoutprintln(helloWorldsayHelloWorld("阿蜜果"));
}
}
在启动webservice_helloworld工程的情况下,运行WebServiceClientTest类,可看到控制台包含如下信息:
hello,阿蜜果
由此可看出调用Web Service成功。
四.总结
与Axis 相比,在实施Web Service时XFire更加简洁高效,并且XFire对Spring提供了强大的支持,可以非常方便地在Spring中使用XFire实施Web Service,因此XFire在短短的时间里成为了受Web Service开发者喜爱的框架。
XFire为客户端提供了多种访问Web Service的方式,如果可以获取客户端的窄接口类,则可以采用窄接口类调用Web Service。如果仅能获取WSDL,XFire也可以采用动态反射的机制调用Web Service。XFire为Eclipse提供了一个可以根据WSDL生成客户端存根代码的插件,相信XFire也将为其它非Java语言提供类似的插 件。
在Axis2中也开始使用Stax来处理XML,还有Xfire不支持WSDL20, 而Axis2支持WSDL20。
还可使用Xfire的后续版本,Apache CXF (相当于 Xfire20)
0条评论