浏览 6521 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-30
javax.ejb.SessionContext接口提供了一个到EJB容器环境的视 图.SessionContext对象可以像组件实例的接口到EJB容器一样获取关于方法调 用的上下文信息,和提供快速的访问EJB服务.一个会话Bean可以获得一个会话上 下文的引用通过@Resource 批注: @Stateless public class ProcessPaymentBean implements ProcessPaymentLocal { @Resource SessionContext ctx; ... } SessionContext允许你获取如同当前用户调用EJB,或查找实体在EJB ENC中.让 我们看一下这个接口的定义: public interface javax.ejb.SessionContext extends javax.ejb.EJBContext { EJBLocalObject getEJBLocalObject( ) throws IllegalStateException EJBObject getEJBObject( ) throws IllegalStateException; MessageContext getMessageContext( ) throws IllegalStateException; <T> getBusinessObject(Class<T> businessInterface) throws IllegalStateException; Class getInvokedBusinessInterface( ); } getEJBObject( ) 和getEJBLocalObject( )方法是陈旧的并且调用它们时会抛 出一个异常.这些对像是在EJB的2.1规范中的风格. SessionContext.getBusinessObject( ) 方法返回一个引用到当前EJB,它可以 被其它的用户调用.这个EJB的引用等价于Java中的this指 针.businessInterface 参数必需是EJB的本地或远程接口中的一个,这样容器才 会知道当前的组件是否创建一个远程或本地引用.getBusinessObject( )方法允 许组件实例获取对自身对象的引用,它可以传递到其它组件,下面是一个例子: @Stateless public class A_Bean implements A_BeanRemote { @Resource private SessionContext context; public void someMethod( ) { B_BeanRemote b = ... // Get a remote reference to B_Bean. A_BeanRemote mySelf = getBusinessObject(A_BeanRemote.class); b.aMethod( mySelf ); } ... } 一个组件实例传递一个this引用到另一个组件是不合法的;取而代之的是,它可 以传递远程或本地EJB对象引用,组件实例的获取从它的SessionContext. SessionContext.getInvokedBusinessInterface( )方法允许你确定是否EJB调 用通过它的远程,本地,或Web Service接口.它返回调用业务接口的类. EJBContext接口 SessionContext 继承javax.ejb.EJBContext类.EJBContext定义了一些为组件 运行期间提供非常有用的信息的一些方法.下面是EJBContext接口的定义: package javax.ejb; public interface EJBContext { public Object lookup(String name); // EJB 2.1 only: TimerService public TimerService getTimerService( ) throws java.lang.IllegalStateException; // security methods public java.security.Principal getCallerPrincipal( ); public boolean isCallerInRole(java.lang.String roleName); // transaction methods public javax.transaction.UserTransaction getUserTransaction( ) throws java.lang.IllegalStateException; public boolean getRollbackOnly( ) throws java.lang.IllegalStateException; public void setRollbackOnly( ) throws java.lang.IllegalStateException; // deprecated and obsolete methods public java.security.Identity getCallerIdentity( ); public boolean isCallerInRole(java.security.Identity role); public java.util.Properties getEnvironment( ); public EJBHome getEJBHome( ) java.lang.IllegalStateException; public EJBLocalHome getEJBLocalHome( ) java.lang.IllegalStateException; } EJBContext.lookup( )方法允许你查找实体在EJB的ENC中并且使其更容易. EJBContext.getTimerService( )方法返回一个到容器的时间服务的引用, 允许无状态会话Bean为自己建立时间事件的通知.换句话说,一个会话Bean可以 设置一个警报,以便容器调用它在一个指定的日期或间隔性的传递.一个时间服 务也可以通过@Resource 批注来注入.时间服务的细节将会在第13章中进行介绍. EJBContext.getCallerPrincipal( )方法用来获取客户端当前访问的组件的 java.security.Principal对象的引用.主要的对象罐,举例来说, 通过用EJB来 跟踪标识用户的更新. @Stateless public class BankBean implements Bank { @Resource SessionContext context; ... public void withdraw(int acctid, double amount) throws AccessDeniedException { String modifiedBy = principal.getName( ); ... } ... } EJBContext.isCallerInRole( )方法告诉你,是否客户端的访问组件是以一个指 定的成员角色,标识通过角色名.这个方法非常有用当多个访问控制,需要方法为 基础的简单访问控制提从.在一个银行系统中,例如,你可能允许出纳员这个角色 来做大多数的退回操作,但是,只有经理角色可以处理超过$10,000的退回.因为 它包括一个业务逻辑问题,所以这种细致的近代制不能够使用EJB的安全属性来 从事.因此,我们使用isCallerInRole()方法提供给EJB,增加自动访问控制.首 先,我们假定所有的经理也都是出纳员.withdraw( ) 方法中的业务逻辑使用 isCallerInRole( )来确定仅有经理角色的可以撤回总数超过$10,000: @Stateless public class BankBean implements Bank { @Resource SessionContext context; public void withdraw(int acctid, double amount) throws AccessDeniedException { if (amount > 10000) { boolean isManager = context.isCallerInRole("Manager"); if (!isManager) { // Only Managers can withdraw more than 10k. throw new AccessDeniedException( ); } } } ... } EJBContext包含的一些方法被用在旧的EJB规,但是已经被EJB3.0放弃了.安全方 法的交互同Identity类,像getEnvironment( ), EJBContext.getEJBHome( ), 和EJBContext.getEJBLocalHome( ) 一样好的方法.已经被废弃.如果执行这些 方法会抛出RuntimeException异常 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |