轻松应对 WS-Security 规范互操作性挑战,第 3 部分: 使用 EJB 代理
2009-11-10 00:00:00 来源:WEB开发网引言
本系列之前的文章介绍了 WS-Security 规范级别的互操作性问题,可帮助您选择合适的解决办法。本文重点讨论如何实现 EJB 代理方法。此方法涉及到构建 EJB Web 服务代理,将其作为 J2EE 1.3 客户机和 J2EE 1.4 Web 服务提供者之间的粘合剂。与本系列以前的文章中所述的中间件代理方法相比,实现 EJB 代理方法只是基本的编程做法。如果您的前端中间件层包含 WebSphere® Application Server V6.0 或更高版本,或者其他能够支持 J2EE 1.4 应用程序的 J2EE 应用程序,则不需要其他中间件基础设施。另外,此方法的可扩展性不如中间件代理方法,因为需要对每个 J2EE 1.3 客户机应用程序进行手动修改。本文中所述的 EJB 代理方法最适合用于需要轻量级低成本解决方案来满足沙箱、测试或概念验证需求的情况。
实现 EJB 代理方法所需的工作主要是应用程序开发工作,不过此解决方法还引入了另一个应用程序,需要操作团队进行部署、保护和管理。此方法还需要涉及测试人员和部署人员。
实现 EJB 代理方法的应用程序开发人员应该具备基本 J2EE 和 Web 服务开发技能。
本文将详细说明如何使用完全实现的示例(可供在您的环境中部署)实现 EJB 代理方法。了解解决方案部分将对此方法进行详细说明。构建解决方案部分将说明如何开发所提供的示例应用程序。使用示例应用程序部分将说明如何在运行时环境中自定义和运行示例应用程序。
了解解决方案
示例应用程序假定您在尝试对以下内容进行集成:
需要 WS-Security 的 J2EE 1.4 Web 服务提供者应用程序
需要调用 Web 服务提供者的 J2EE 1.3 客户机应用程序
图 1 为示例 EJB 代理解决方法的详细运行时视图。在图 1 中客户机应用程序(一个 J2EE 1.3 Servlet)使用 RMI/IIOP 与 J2EE 1.4 EJB 代理应用程序通信。然后,EJB 代理应用程序将使用 Web 服务及 WS-Security V1.0 规范与 Web 服务提供者应用程序通信。请注意,客户机应用程序可以为无法使用 WS-Security V1.0 规范通信的 J2EE 1.3 Servlet、J2EE 1.3 Portlet 或任何客户机应用程序。
图 1. EJBProxy 解决方案组件
图片看不清楚?请点击这里查看原图(大图)。
创建解决方案所需的任务和产品如表 1 中所示。
表 1. 创建解决方案所需的任务和产品
任务 | 环境 | 负责角色 |
1. 创建 J2EE 1.4 EJB 代理应用程序,在单个 J2EE 1.4 EJB 项目中包括以下构件:
一个 J2EE 1.4 会话 Bean 一个 J2EE 1.4 Web 服务客户机代理 | Rational® Application Developer | 应用程序开发人员 |
2. 如果有必要,创建一个共享库,其中包含 Web 服务中使用的类文件。 | Rational Application Developer | 应用程序开发人员 |
3. 将 J2EE 1.3 客户机应用程序与 J2EE 1.4 EJB 会话 Bean 集成。 | Rational Application Developer | 应用程序开发人员 |
4. 将 EJB 会话 Bean 与 J2EE 1.4 Web 服务客户机代理集成。 | Rational Application Developer | 应用程序开发人员 |
5. 针对 WS-Security 配置 EJB 代理应用程序。 | Rational Application Developer | 应用程序开发人员 |
6. 打包解决方案。 | Rational Application Developer | 应用程序开发人员 |
7. 在运行时上部署解决方案并进行单元测试。 | WebSphere Application Server | 部署人员和测试工程师 |
任务 1 的实现涉及到使用 Rational Application Developer 中恰当的向导来开发会话 Bean 和 Web 服务客户机代理。可以在构建解决方案部分中找到关于这方面的详细示例。
任务 2 的实现取决于您的应用程序需求。如果您的 Web 服务接口包括复杂的对象类型,则需要创建共享库,以便在客户机应用程序和 EJB 代理应用程序之间传递复杂对象。由于 J2EE 1.3 客户机应用程序和 EJB 代理使用 RMI 进行通信,这些对象类必须可序列化,即必须实现 java.io.Serializable 接口。通过使用 Rational Application Developer 中恰当的 Web 服务代码生成选项,可以创建实现 java.io.Serializable 接口的复杂数据类。
任务 4 需要为以下应用程序创建可部署包:
客户机应用程序。需要对此应用程序重新打包,因为需要对其更新,以与 EJB 代理应用程序集成。客户机应用程序可能还需要包括共享库(如果使用)的 JAR 文件。
EJB 代理应用程序。此应用程序必须打包为 EAR 文件,而且其中还可能包括共享库(如果使用)的 JAR 文件。
任务 7 中给出的解决方案部署工作需要部署以下应用程序:
客户机应用程序
EJB 代理应用程序
未更改的 Web 服务提供者应用程序
构建解决方案
此部分描述如何创建合适的 EJB 代理,以便用于将客户机与提供者应用程序集成。下面的代码片段摘自示例应用程序。提供这些代码的目的是为了方便您了解如何将此方法应用于自己的应用程序。表 2 说明了所需的任务。
表 2. 创建解决方案所需的步骤和产品
任务 | 步骤 | 应用程序类型 | 环境 | 负责角色 |
1. 创建 J2EE 1.4 EJB 代理应用程序,在单个 J2EE 1.4 EJB 项目(如 EJBProxy)中包括以下构件:
一个 J2EE 1.4 会话 Bean 一个 J2EE 1.4 Web 服务客户机代理 | 完成这些步骤,以创建 J2EE 1.4 会话 Bean: 创建带有 EJB 客户机 JAR 项目的 EJB 项目。 在 EJB 项目中创建 EJB 会话 Bean,如 DefaultSessionBean。 创建 EJB 会话 Bean 方法,如 public SampleOperationResponse makeWebservicesCall(String inputString)。 在 EJB 项目中创建 J2EE 1.4 Web 服务客户机。 | EJB 代理 | Rational Application Developer | 应用程序开发人员 |
2. 如果有必要,创建一个共享库,其中包含 Web 服务中使用的类文件。 | 完成这些步骤,以创建共享库:
创建 Java 项目。 将 EJB 项目中创建的 J2EE1.4 Web 服务客户机类移动到 Java 项目中。 | EJB 代理、客户机应用程序 | Rational Application Developer | 应用程序开发人员 |
3. 将 J2EE 1.3 客户机应用程序与 J2EE 1.4 EJB 会话 Bean 集成。 | 更新客户机应用程序,以进行 EJB 调用。 | 客户机应用程序 | Rational Application Developer | 应用程序开发人员 |
4. 将 EJB 会话 Bean 与 Web 服务客户机代理集成。 | 更新 EJB 会话 Bean 方法 public SampleOperationResponse makeWebservicesCall(String inputString),以进行 Web 服务调用。 | EJB 代理 | Rational Application Developer | 应用程序开发人员 |
5. 针对 WS-Security 配置 EJB 代理应用程序。 | 配置 EJB 代理应用程序,以启用安全性。 | EJB 代理 | Rational Application Developer | 部署人员 |
6. 打包解决方案。 | 为以下解决方案应用程序创建包:
客户机应用程序 EJB 代理 Web 服务提供者 | 客户机应用程序、EJB 代理、Web 服务提供者 | Rational Application Developer | 部署人员 |
7. 在运行时上部署和测试解决方案。 | 在运行时环境中部署和测试已打包的解决方案应用程序 | 客户机应用程序、EJB 代理、Web 服务提供者 | WebSphere Application Server | 部署人员和测试工程师 |
任务 1. 创建 EJB 代理应用程序
要完成此步骤,请进行以下工作:
所需的 EJB 操作如表 2 中所示。
下面说明了创建 Web 服务客户机所需的基础知识。
在 Rational Application Developer 中调用 Web Service Client Wizard。
在 Web Service Selection Page 上选择 Java 代理作为客户机类型,并输入指向 WSDL 的 URL。
在 Client Environment Configuration Page 上将 J2EE 版本指定为 1.4,并将 EJB 指定为客户机类型,并指定客户机项目和 EAR 项目。
任务 2. 创建共享库
完成了任务 1 并创建 Java 项目后,就准备好移动 J2EE 1.4 Web 服务客户机类了。生成的 Web 服务客户机类位于 Web 服务的目标命名空间所决定的文件夹中。以下是要移动的文件的列表:
每个复杂数据类型的 Java 类。示例应用程序的相关类名称为 SampleOperationResponse。
每个复杂类型的序列化器、反序列化器和 Helper 类 *_Ser、*_Deser 和 *_Helper。示例应用程序相关的类名称为 SampleOperationResponse_Ser、SampleOperationResponse_Deser 和 SampleOperationResponse_Helper。
客户机代理和客户端存根 *_PortTypeProxy 和 *SOAPStub。示例应用程序相关的类名称为 SampleOperationResponse_PortTypeProxy 和 SampleServiceSOAPStub。
客户端服务器定位符的接口和实现类 *_Service 和 *_ServiceLocator。示例应用程序相关的类名称为 SampleService_Service 和 SampleService_ServiceLocator。
WebSphere 特定的扩展类 *_ServiceInformation。示例应用程序的相关类名称为 SampleService_ServiceInformation。
图 2 显示了为示例应用程序重新分配的文件。
图 2. 重新分配的文件
移动 Web 服务客户机类会导致编译错误,因为 J2EE.jar 和 webservices.jar 文件不位于 Java 项目最初的 Java 构建路径中。完成了任务 4. 打包解决方案应用程序后,会在 Java 项目的 Java 构建路径中包括相应的库(其中包括 J2EE.jar 和 webservices.jar 文件)。
任务 3. 从客户机应用程序调用 EJB 代理应用程序
完成了表 2 的任务 1 和任务 2 后,就准备好进行此步骤了。此部分说明对客户机应用程序所需的更新,以便调用 EJB 代理(此代理将调用 Web 服务提供者)。
添加负责进行 EJB 代理调用和返回复杂对象的方法。示例应用程序使用 Java 类 EJBAccessBean 作为 Servlet 应用程序的一部分,并使用 public SampleOperationResponse ejbCall(String inputString) 方法进行 EJB 代理调用。EJBAccessBean 位于 SampleClient 对象。
清单 1. 进行 EJB 调用的示例 Servlet 方法
/**
* Step 1. Add required imports
**/
package test.bean;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import com.test.SampleOperationResponse;
import ejbs.DefaultSession;
import ejbs.DefaultSessionHome;
...
public SampleOperationResponse ejbCall(String inputString)
{
//Enterprise Bean name is: DefaultSession
DefaultSession sampleProxy = null;
Hashtable env = new Hashtable();
SampleOperationResponse responseObj = null;
try
{
/**
* Step 2. Set the following JNDI environment properties in the
* initial context constructor and get the initial context.
* i. java.naming.provider.url (provider URL) property that specifies the
* location of the registry.
* ii.java.naming.factory.initial which specifies the class name of the
* initial context factory for the registry service provider.
**/
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.websphere.naming.WsnInitialContextFactory");
env.put(Context.PROVIDER_URL, "corbaloc::localhost:2809");
InitialContext initialContext = new InitialContext(env);
...
/**
* Step 3. Perform the lookup
**/
String jndiName = "ejb/ejbs/DefaultSessionHome";
Object ejbObj = initialContext.lookup(jndiName);
...
/**
* Step 4. Get the home interface for the EJB Proxy: DefaultSession.
**/
DefaultSessionHome home = (DefaultSessionHome) PortableRemoteObject
.narrow(ejbObj, DefaultSessionHome.class);
...
/**
* Step 5. Obtain the remote reference for the EJB Proxy: DefaultSession.
**/
sampleProxy = home.create();
...
/**
* Step 6. Invoke and work with the remote EJB method,
* makeWebservicesCall(String inputString, OtherMethodParameters parameters)
|--10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
**/
responseObj = sampleProxy.makeWebServicesCall(inputString);
...
}
catch(Exception e)
{
System.out.println("EJBAccessBean::ejbCall() -> Caught an error with
following reason: " + e.getMessage());
}
return responseObj;
}
由于客户机和 EJB 代理应用程序可能不会像图 1 中所示的那样驻留在相同的应用服务器容器中,因此无法使用缺省上下文属性来查找 EJB 会话 Bean 的主接口。
清单 2 的粗体代码片段说明了调用 public SampleOperationResponse ejbCall(String inputString) 方法的第二个更新,此方法进行 EJB 调用并在示例客户机应用程序 public class SampleServlet2_3 中返回复杂对象 SampleOperationResponse。public class SampleServlet2_3 也位于 SampleClient 项目中。
清单 2. 进行 EJB 代理调用...
import com.test.SampleOperationResponse;
import test.bean.EJBAccessBean;
...
public class SampleServlet2_3 extends HttpServlet implements Servlet
{
...
protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws
ServletException, IOException
{
...
displayInputPage(arg0, arg1);
...
}
...
protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws
ServletException, IOException
{
...
String inputValue = (String)arg0.getParameter("inputText");
if (inputValue != null)
{
...
EJBAccessBean accessBean = new EJBAccessBean();
SampleOperationResponse responseObj = accessBean.ejbCall(inputValue);
...
}
...
}
...
}
构建解决方案的下一步是更新 EJB 项目中的会话 Bean,以使用 Web 服务客户机代理类调用 Web 服务提供者。
任务 4. 从 EJB 会话 Bean 调用 Web 服务提供者应用程序
清单 3 中所示的代码片段显示了 EJB 会话 Bean 方法 public SampleOperationResponse makeWebservicesCall(String inputString),此方法在表 2 的任务 1 中创建。此方法使用 Web 服务客户机代理类 SampleService_PortTypeProxy 调用 Web 服务提供者,并将复杂对象 SampleOperationResponse 返回到其调用方。EJB 会话 Bean public class DefaultSessionBean 位于 EJBProxy 项目。
清单 3. 调用 Web 服务提供者
/**
* Step 1. Add required imports
**/
import com.test.SampleOperationResponse;
import com.test.SampleService_PortTypeProxy;
...
/**
* Step 2. This sample EJB method accepts a String as a method parameter, which
* will be provided by the servlet.
* This method passes its method parameter to the to the Web service provider
* and returns a SampleOperationResponse type of complex object to the
* servlet.
**/
public SampleOperationResponse makeWebServicesCall(String inputString)
{
/**
* Step 3. Instantiate the Web service proxy class
* SampleService_PortTypeProxy, and invoke the Web service operation
* sampleOperation(inputString)
**/
SampleService_PortTypeProxy sampleServiceProxy =
new SampleService_PortTypeProxy();
SampleOperationResponse response = null;
try
{
response = sampleServiceProxy.sampleOperation(inputString);
}
else
System.out.println("DefaultSessionBean::makeWebServicesCall() ->
Response String is Null");
}
catch(Exception e)
{
System.out.println("DefaultSessionBean::makeWebServicesCall() ->
An error caught with the following reason" + e.getMessage());
}
return response;
}
图 3 给出了一份序列关系图,以可视的方式说明了客户机应用程序如何通过 EJB 代理调用 Web 服务提供者。
图 3. 从 J2EE 1.3 Servlet 调用 J2EE 1.4 Web 服务提供者的序列关系图
图片看不清楚?请点击这里查看原图(大图)。
任务 5. 针对 WS-Security 配置 EJB 代理应用程序
任务 6. 打包解决方案应用程序
此部分说明如何打包解决方案组件(均在 Rational Application Developer 环境中创建)。
打包客户机应用程序。
以下依赖 JAR 文件应该与客户机应用程序打包在一起:
EJB 客户机的 JAR 文件。此客户机 JAR 文件是在创建 EJB 代理应用程序时由工具创建的(请参见表 2 中的任务 1)。
包含共享库的 JAR 文件。
以下是打包 Servlet(在本文的示例中作为客户机应用程序使用)所需的任务:
在 ServletEAR 项目中,打开 META-INF/application.xml 文件,并单击 Module 选项卡。
打开 Project Utility JARs 部分,并选择 EJB 客户机项目。然后选择共享库的 Java 项目。此步骤将两个 JAR 文件添加到 Project Utility JARs 中:EJB 客户机 JAR 和共享库 JAR。
转到 Web 项目,将其突出显示,并单击右键。转到 Properties > Java Jar Dependencies。
在 Java Jar Dependencies 屏幕上,选择 EJB client project。然后选择要添加到 Java Jar Dependencies 中的共享库的 Java 项目。
单击 OK。
在 Web 项目中,打开 WebContent/WEB-INF/web.xml 文件,并单击 Overview 选项卡。
转到 Web Library Projects,并添加 EJB 客户机项目。然后添加要添加到 Web Library Projects 中的共享库的 Java 项目。
打包 EJB 客户机。
EJB 客户机项目需要能够识别依赖 JAR 文件中的 Web 服务类,因此需要配置包含共享库的 JAR 文件。以下步骤提供了一个示例。
转到 EJB 客户机项目,将其突出显示,并单击右键。转到 Properties > Java Jar Dependencies。
在 Java Jar Dependencies 屏幕上选择共享库的项目。
单击 OK。
EJB 客户机的文件同时包括在客户机应用程序 EAR 和 EJB 代理 EAR 中。
打包 EJB 代理。
EJB 代理应用程序的 EJB 项目也需要能够识别依赖 JAR 文件中的 Web 服务类。
在 EJB 代理 EAR 项目中,打开 META-INF/application.xml 文件,并单击 Module 选项卡。
打开 Project Utility JARs 部分,并选择共享库(其中包含 Web 服务类文件)的 Java 项目。此步骤将两个 JAR 文件添加到 Project Utility JARs 中:EJB 客户机 JAR 和共享库 JAR。
转到 EJB 项目,将其突出显示,并单击右键。转到 Properties > Java Jar Dependencies。
在 Java Jar Dependencies 屏幕上,选择要添加到 Java Jar Dependencies 中的共享库的 Java 项目。
单击 OK。
应用程序现在已经准备好,可以进行部署和测试了。
任务 7. 部署和测试解决方案
使用示例应用程序
此部分说明如何将完全实现的示例应用程序部署到运行时环境中。要部署示例,需要进行以下工作:
WebSphere Application Server V5.0.x 或更高版本,用于客户机应用程序。
WebSphere Application Server V6.0.x 或更高版本,用于运行 EJB 代理应用程序和 Web 服务提供者应用程序。
这些运行时环境应该配置为使用全局安全性,而且应该配置为通过相同 LTPA 密钥进行 LTPA 身份验证。
使用示例应用程序的第一步是下载下载部分中提供的文件。这些文件包括:
SampleProjects.zip,包括示例应用程序的源代码
SampleService.ear,Web 服务提供者应用程序的可部署存档文件
EJBProxy.ear,EJB 代理应用程序的可部署存档文件
SampleClient.ear,客户机应用程序的可部署存档文件
本文提供的示例应用程序进行了刻意的简化,以便将重点放在理解 EJB 代理解决方案上。此示例应用程序遵循模型-视图-控制器(Model-View-Controller,MVC)设计模式,具有以下特征:
示例 Web 服务提供者应用程序组成了解决方案的模型层。其中包括一个 EJB 组件和一个 Web 服务组件。Web 服务提供 sampleOperation(inputString) 操作。此操作从控制器层获得一个 String 值,并返回复杂 SampleOperationResponse 类型对象。此数据类型包含以下内容:
String serviceResponseString。Web 服务将 inputString 值放入此响应字符串中。
String serviceUserName。Web 服务的 EJB 组件将当前安全上下文中包含的用户名传入此响应字符串。
示例客户机应用程序构成解决方案的控制层。其中包含实现 Servlet 2.3 规范的 J2EE 1.3 Servlet。示例客户机应用程序执行以下操作:
显示输入页面,以便用户提供字符串。
使用提供的字符串作为 inputString 值调用 EJB 代理应用程序。
显示图 5 中所示的输出页所导致的 EJB 代理调用。
示例 EJB 代理应用程序属于模型层的一部分,其中包含一个 EJB SessionBean。EJB 代理应用程序进行以下工作:
接受输入客户机应用程序提供的字符串 inputString。
调用 Web 服务代理类 SampleService_PortTypeProxy,后者将使用 sampleOperation(inputString) 操作把输入字符串传递给 Web 服务提供者。此操作由 SampleService_PortTypeProxy 类提供。在响应中,代理将接收到一个 SampleOperationResponse 数据类型对象。
获得复杂对象 SampleOperationResponse 的实例。
将复杂对象的实例返回给客户机应用程序,后者将在输出页面上显示对象的属性,如图 5 中所示。
实例 Web 服务提供者应用程序配置为通过轻量级第三方认证(Lightweight Third Party Authentication,LTPA)令牌使用 WS-Security。LTPA 令牌是从客户机将用户标识传递到 Web 服务提供者的一种方法。通过按照服务提供者应用程序中的做法返回和显示当前安全上下文的名称,这些示例操作可以验证 J2EE 1.3 客户机应用程序是否的确能够与 J2EE 1.4 Web 服务提供者进行通信。
下载了提供的文件后,就已经准备好进行以下操作之一了:
在远程 WebSphere Application Server 上运行示例应用程序,如图 1 中所示。按照下面列表中所示,完成任务 1-6,以自定义和远程运行示例应用程序。
在同一个 WebSphere Application Server 上以本地方式运行示例应用程序。跳过任务 1-3,并按照任务 4-6 所述进行操作,如下面的列表中所示。
以本地或远程方式运行示例应用程序所需的任务如下:
将示例应用程序的源代码导入 Rational Application Developer 工作区。
更新必要的源文件,以反映运行时环境的主机名。
打包解决方案组件。
将应用程序部署到运行时。
在 WebSphere Application Server 中配置安全性。
运行示例应用程序。
以下部分对这些任务进行了详细描述。
任务 1. 导入示例应用程序的源代码
示例应用程序的源代码由表 3 中所示的各个构件组成,包含在 SampleProjects.zip 文件中。使用了 Rational Application Developer 的 Project Interchange export 功能将解决方案的源代码导出到 SampleProjects.zip 文件中,以便能方便地将此源代码导入到其他 Rational Application Developer 工作区中。
单击 File > Import 并选择 Project Interchange。
单击 Next。然后提供 zip 文件的位置,并选择所提供的项目。
表 3. 示例应用程序构件列表
应用程序类型 | 项目类型 | 项目名称 | 描述 |
Web 服务提供者 | EAR 项目 | SampleServiceEAR | 此项目包括 application.xml 文件。 |
Web 服务提供者 | EJB 项目 | SampleServiceEJB | 此项目包括 EJB 会话 Bean SampleServiceBean。 |
Web 服务提供者 | Java 项目 | SampleServiceEJBClient | 此项目包括以下类:
会话 Bean SampleService 的远程接口 会话 Bean SampleServiceHome 的主接口 会话 Bean SampleServiceLocal 的本地接口 会话 Bean SampleServiceLocalHome 的本地主接口 |
Web 服务提供者 | Web 项目 | SampleServiceWeb | 此项目包括与类相关的 Web 服务,其中包括 WSDL 中定义的在服务 SampleOperationResponse 之间传递的复杂数据类型的 Java 类。 |
EJB 代理 | EAR 项目 | EJBProxyEAR | 此项目包括 application.xml 文件。 |
EJB 代理 | EJB 项目 | EJBProxy | J2EE 1.4 Web 服务客户机类: WSDL 中定义的在服务 SampleOperationResponse 间传递的复杂数据类型的 Java 类 Web 服务客户机代理 SampleService_PortTypeProxy 类 EJB 会话 Bean DefaultSessionBean |
EJB 代理 | Java 项目 | EJBProxyClient | 此项目包括以下类:
会话 Bean DefaultSession 的远程接口 会话 Bean DefaultSessionHome 的主接口 |
EJB 代理和客户机 | Java 项目 | CommonClasses | 此项目包括 Web 服务类所在的共享库。 |
客户机 | EAR 项目 | SampleClientEAR | 此项目包括 application.xml 文件。 |
客户机 | Web 项目 | SampleClient | 此项目包括两种类型的类:
使用 Servlet 2.3 规范 SampleServlet2_3 创建的 J2EE 1.3 Servlet Servlet EJBAccessBean 的 Helper 类 |
任务 2 - 4. 更新、打包并将示例解决方案部署到运行时中
客户机应用程序和 EJB 代理的源代码必须进行自定义,以反映运行时环境的主机名。
自定义 EJBAccessBean 的 public SampleOperationResponse ejbCall(String inputString) 方法。提供 EJB 代理应用程序所在的的主机名作为提供者 URL,如清单 1 中的步骤 2 中所示。
在以下文件中提供主机名。查找字符串 localhost,并使用恰当的主机名进行替换。
定位符类位于 EJBProxy 项目中 com.test.SampleService_ServiceLocator.java
WSDL 文件位于 EJBProxy 项目的 META-INF 目录中 sampleService.wsdl
重新生成 EJB 部署类,因为所提供的 EJB 代理应用程序并不包括生成的部署类。
在 J2EE 透视图中,转到 EJBProxy 项目。然后将其突出显示并右键单击此项目。
选择 Deploy。
对所需的文件进行自定义之后,就可以使用 SampleClientEAR 和 EJBProxyEAR 项目为 Servlet 和 EJBProxy 应用程序创建可部署包。然后将这些包和提供的 Web 服务提供者应用程序的 SampleService.ear 文件部署到 WebSphere Application Server 中。
任务 5. 在 WebSphere Application Server 中配置安全性
配置 WebSphere Application Server,以将 Active Authentication Mechanism 设置为 LTPA。单击 Security and Global Security 选项,通过使用 WebSphere 管理控制台完成此工作。
任务 6. 运行示例解决方案
自定义并在 WebSphere Application Server 中部署示例应用程序后,就可以运行解决方案了。以下步骤说明了如何运行示例解决方案:
运行显示输入页的 Servlet,如图 4 所示。将提示您对 Servlet 进行身份验证。
使用属于全局安全性所用的注册表的任何用户 ID 进行身份验证。按照页面上所示显示输入字符串,单击 Send 按钮。
图 4. 输入页面
Servlet 使用输入字符串调用 EJB 代理应用程序,以将其提供给 Web 服务提供者应用程序。然后将在输入页上显示 EJB 代理应用程序调用返回的结果,如图 5 中所示。
图 5. 输出页
输出页上显示的用户 ID 应该与用于通过 Servlet 身份验证的 ID 相同。如果是这样,则可以确信客户机用户标识使用 WS-Security 成功传播到了 Web 服务提供者应用程序。
结束语
本文说明了如何使用 EJB 代理来处理 WS-Security 规范级别互操作性问题。如果沙箱、测试或概念验证项目中无法将 Web 服务使用者应用程序升级到 J2EE 1.4,而且无法承担建立中间件代理的成本,则最适合选择此方法。此方法主要是一种直接的应用程序开发方法。文中的的示例说明了如何处理涉及复杂消息类型时的一些缺陷。
下载
描述 | 名字 | 大小 | 下载方法 |
Sample projects zip file | SampleProjects.zip | 71KB | HTTP |
Sample service ear file | SampleService.ear | 74KB | HTTP |
Sample EJB proxy ear file | EJBProxy.ear | 93KB | HTTP |
Sample client ear file | SampleClient.ear | 104KB | HTTP |
更多精彩
赞助商链接