程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 教您如何成為 EJB 專家詳解系列連載之五

教您如何成為 EJB 專家詳解系列連載之五

編輯:關於JAVA

為beanss增加功能

1、關於beans的home對象和EJB對象的信息

2、beans的當前事務信息

3、對於客戶授權的安全信息。beans可以通過查詢環境決定客戶執行操作所需要的安全層次

4、beans的環境屬性

容器將所有這些信息保存在一個稱為EJB context object的對象裡。EJB上下文作為容器的物理部分,可以被beans訪問。這些訪問可以讓beans得到當前的狀態和改變當前的狀態。上下文可以在beans的生命期中被更改。

EJB1.0 Javax.ejb.EJBContext接口:

public interface Javax.ejb.EJBContext

{

public Javax.ejb.EJBHome getEJBHome();

public Java.util.PropertIEs getEnvironment();

public Java.security.Identity getCallerIdentity();

public boolean isCallerInRole(Java.security.Identity);

public Javax.jts.UserTransaction getUserTransaction();

public void setRollbackOnly();

public boolean getRollbackOnly();

}

會話beans的上下文,上下文根據beans的不同分為:會話上下文和實體上下文。它們分別被用於會話beans和實體beans。

Javax.ejb.EJBContext

public interface Javax.ejb.SessionContext

extends Javax.ejb.EJBContext

{

public Javax.ejb.EJBObject getEJBObject();

}

注意:

SessionContext接口繼承了EJBContext接口,在EJBContext中定義的方法提供了對會話beans的存取路徑。對於會話beans,調用setSessionContext,這個方法在Javax.ejb.Sessionbeans接口中被定義。對於實體beans,調用setEntityContext。

SessionContext.getEJBObject()

在EJB中,beanss可以作為其他beans的客戶端。如果一個beans需要調用另外的beans,getEJBObject()方法則是必需的。在Java中,對象可以使用this關鍵字保存自身的參考。在EJB中,beans不能使用this關鍵字給其他beans傳遞對象,這是因為所有的客戶調用beans上的方法都是間接調用beans的EJB對象。beans可以使用this關鍵字將自己傳給EJB對象。

了解EJB的安全性,首先,客戶端必須是可被鑒別的。其次,客戶端必須是已經授權的。

第一步:鑒別;

不同的EJB容器擁有不同的鑒別客戶端的方法。例如:BEA的WebLogic中,當不同客戶端代碼使用JNDL定位Home對象時,提供不同的用戶名和密碼。

Properties props = System.getPropertIEs();

props.put(Context.SECURITY_PRINCIPAL, "EmployeeA");

props.put(Context.SECURITY_CREDENTIALS, "myPassWord1");

Context ctx = new InitialContext(props);

// Use the initial context to lookup home objects...

EJB沒有制定如何鑒別的規范,因此這樣就影響了可移植性。要了解這方面,查看各類容器的文檔。當運行這段代碼時,應用服務器將驗證你的用戶名和密碼,這是應用服務器規范。許多應用服務器允許在屬性文件裡設置用戶名和密碼。這個文件將在運行時由應用服務器讀。高級點的服務器支持已經存在的驗證系統的整合。例如將用戶名和密碼列表存儲在LDAP服務器中。

第二步:授權

只有經過授權的客戶端才可以調用beans中的方法。EJB中有兩種驗證授權的方法:declaratively和programmatically。即:由容器執行所有的授權檢驗、在程序中進行授權檢查。

Declarative授權檢查時,要在配置描述符中聲明beans的授權需要。例如使用BEA的WebLogic服務器的配置描述符的例子:

(AccessControlEntrIEs

submitPurchaSEOrder [employees]

approvePurchaSEOrder [managers]

DEFAULT [administrators]

); end AccessControlEntrIEs

容器將在運行時自動的執行安全檢查。拋會出Java.lang.SecurityException異常。Programmatic授權檢查,必須查詢EJB上下文得到當前客戶端的授權信息。由兩種方法調用CallerInRole(Identity role)和getCallerIdentity()。

isCallerInRole()

import Java.security.Identity;

...

public class Mybeans implements Sessionbeans {

private SessionContext ctx;

...

public void foo() {

Identity id = new MyIdentity("administrators");

if (ctx.isCallerInRole(id)) {

System.out.println("An admin called me");

return;

}

System.out.println("A non-admin called me");

}

}

import Java.security.Identity;

public class MyIdentity extends Identity {

public MyIdentity(String id) {

super(id);

}

}

getCallerIdentity()

import Java.security.Identity;

...

public class Mybeans implements Sessionbeans {

private SessionContext ctx;

...

public void bar() {

Identity id = ctx.getCallerIdentity();

String name = id.getName();

System.out.println("The caller′s name is " + name);

}

}

了解EJB對象的操作,許多EJB應用程序需要客戶端有與beans斷開的能力,還要有與beans重建連接的能力。EJB提供了EJB object handles。EJB對象操作對於EJB對象是一個長生命期的代理。可以用它來重建與EJB對象的連接,並保證會話狀態不被丟失。下面是EJB對象操作的代碼:

// First, get the EJB object handle from the EJB object.

Javax.ejb.Handle myHandle = myEJBObject.getHandle();

// Next, serialize myHandle, and then save it in

// permanent storage.

ObjectOutputStream stream = ...;

stream.writeObject(myHandle);

// time passes...

// When we want to use the EJB object again,

// deserialize the EJB object handle

ObjectInputStream stream = ...;

Handle myHandle = (Handle) stream.readObject();

// Convert the EJB object handle back into an EJB object

MyRemoteInterface myEJBObject =

(MyRemoteInterface) myHandle.getEJBObject();

// Resume calling methods again

myEJBObject.callMethod();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved