国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

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

2019-11-18 12:34:59
字體:
供稿:網(wǎng)友

  為beanss增加功能
  1、關(guān)于beans的home對象和EJB對象的信息
  2、beans的當(dāng)前事務(wù)信息
  3、對于客戶授權(quán)的安全信息。beans可以通過查詢環(huán)境決定客戶執(zhí)行操作所需要的安全層次
  4、beans的環(huán)境屬性
  
  容器將所有這些信息保存在一個稱為EJB context object的對象里。EJB上下文作為容器的物理部分,可以被beans訪問。這些訪問可以讓beans得到當(dāng)前的狀態(tài)和改變當(dāng)前的狀態(tài)。上下文可以在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的上下文,上下文根據(jù)beans的不同分為:會話上下文和實體上下文。它們分別被用于會話beans和實體beans。
  
  Javax.ejb.EJBContext
  public interface Javax.ejb.sessionContext
  extends Javax.ejb.EJBContext
  {
  public Javax.ejb.EJBObject getEJBObject();
  }
  
  注重:
  
  SessionContext接口繼續(xù)了EJBContext接口,在EJBContext中定義的方法提供了對會話beans的存取路徑。對于會話beans,調(diào)用setSessionContext,這個方法在Javax.ejb.Sessionbeans接口中被定義。對于實體beans,調(diào)用setEntityContext。
  
  SessionContext.getEJBObject()
  
  在EJB中,beanss可以作為其他beans的客戶端。假如一個beans需要調(diào)用另外的beans,getEJBObject()方法則是必需的。在Java中,對象可以使用this要害字保存自身的參考。在EJB中,beans不能使用this要害字給其他beans傳遞對象,這是因為所有的客戶調(diào)用beans上的方法都是間接調(diào)用beans的EJB對象。beans可以使用this要害字將自己傳給EJB對象。
  
  了解EJB的安全性,首先,客戶端必須是可被鑒別的。其次,客戶端必須是已經(jīng)授權(quán)的。
  
  第一步:鑒別;
  不同的EJB容器擁有不同的鑒別客戶端的方法。例如:BEA的WebLogic中,當(dāng)不同客戶端代碼使用JNDL定位Home對象時,提供不同的用戶名和密碼。
  
  Properties props = System.getProperties();
  props.put(Context.SECURITY_PRINC  props.put(Context.SECURITY_CREDENTIALS, "myPassWord1");
  Context ctx = new InitialContext(props);
  // Use the initial context to lookup home objects...
  
  EJB沒有制定如何鑒別的規(guī)范,因此這樣就影響了可移植性。要了解這方面,查看各類容器的文檔。當(dāng)運行這段代碼時,應(yīng)用服務(wù)器將驗證你的用戶名和密碼,這是應(yīng)用服務(wù)器規(guī)范。許多應(yīng)用服務(wù)器答應(yīng)在屬性文件里設(shè)置用戶名和密碼。這個文件將在運行時由應(yīng)用服務(wù)器讀。高級點的服務(wù)器支持已經(jīng)存在的驗證系統(tǒng)的整合。例如將用戶名和密碼列表存儲在LDAP服務(wù)器中。
  
  第二步:授權(quán)
  只有經(jīng)過授權(quán)的客戶端才可以調(diào)用beans中的方法。EJB中有兩種驗證授權(quán)的方法:declaratively和programmatically。即:由容器執(zhí)行所有的授權(quán)檢驗、在程序中進(jìn)行授權(quán)檢查。
  
  Declarative授權(quán)檢查時,要在配置描述符中聲明beans的授權(quán)需要。例如使用BEA的WebLogic服務(wù)器的配置描述符的例子:
  
  
  (accessControlEntries
  submitPurchaSEOrder [employees]
  approvePurchaseOrder [managers]
  DEFAULT [administrators]
  ); end accessControlEntries
  
  容器將在運行時自動的執(zhí)行安全檢查。拋會出Java.lang.SecurityException異常。Programmatic授權(quán)檢查,必須查詢EJB上下文得到當(dāng)前客戶端的授權(quán)信息。由兩種方法調(diào)用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應(yīng)用程序需要客戶端有與beans斷開的能力,還要有與beans重建連接的能力。EJB提供了EJB object handles。EJB對象操作對于EJB對象是一個長生命期的代理。可以用它來重建與EJB對象的連接,并保證會話狀態(tài)不被丟失。下面是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();

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 蓝田县| 隆回县| 额济纳旗| 西畴县| 双牌县| 松滋市| 西丰县| 开化县| 池州市| 青州市| 如皋市| 微博| 察雅县| 城口县| 丹凤县| 湖北省| 手游| 丹东市| 什邡市| 岐山县| 玛沁县| 炎陵县| 哈巴河县| 兴化市| 益阳市| 长顺县| 天峻县| 吉木萨尔县| 济阳县| 连江县| 上虞市| 五原县| 汽车| 永昌县| 陇西县| 莱阳市| 邛崃市| 东城区| 东海县| 松阳县| 什邡市|