SessionContext与EJBContext
装载:http://www.iteye.com/topic/283208 yingfang05
SessionContext 
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异常
posted on 2012-03-21 10:18 anuo_ruibo 阅读(1269) 评论(0) 收藏 举报
 
                     
                    
                 
                    
                 
                
            
         
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号