分享
 
 
 

Beans入门必读之为Beans增加功能

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

EJB 上下文:通往容器的门户

存在如下信息:

1、关于bean的home对象和EJB对象的信息

2、bean的当前事务信息。

3、 对于客户授权的安全信息。Bean可以通过查询环境决定客户执行操作所需要的安全层次。

4、 bean的环境属性。

容器将所有这些信息保存在一个称为EJB context object的对象里。EJB上下文作为容器的物理部分,可以被bean访问。这些访问可以让bean得到当前的状态和改变当前的状态。

上下文可以在bean的生命期中被更改。

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();

}

会话bean的上下文

上下文根据bean的不同分为:会话上下文和实体上下文。它们分别被用于会话bean和实体bean

javax.ejb.EJBContext

public interface javax.ejb.SessionContext

extends javax.ejb.EJBContext

{

public javax.ejb.EJBObject getEJBObject();

}

注意:SessionContext接口继承了EJBContext接口,在EJBContext中定义的方法提供了对会话bean的存取路径。

对于会话bean,调用setSessionContext,这个方法在javax.ejb.SessionBean接口中被定义。对于实体bean,调用setEntityContext。

SessionContext.getEJBObject()

在EJB中,beans可以作为其他bean的客户端。如果一个bean需要调用另外的bean,getEJBObject()方法则是必需的。在java中,对象可以使用this关键字保存自身的参考。在EJB中,bean不能使用this关键字给其他bean传递对象,这是因为所有的客户调用bean上的方法都是间接调用bean的EJB对象。Bean可以使用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服务器中。

第二步:授权

只有经过授权的客户端才可以调用bean中的方法。EJB中有两种验证授权的方法:declaratively和programmatically。即:由容器执行所有的授权检验、在程序中进行授权检查。

Declarative授权检查时,要在配置描述符中声明bean的授权需要。例如使用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 MyBean implements SessionBean {

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 MyBean implements SessionBean {

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应用程序需要客户端有与bean断开的能力,还要有与bean重建连接的能力。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();

例子:The Puzzle Game “Fazuul”

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有