• 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异常

  • 相关阅读:
    162. 寻找峰值
    152. 乘积最大子数组
    MAT 下载及安装
    Netty NIO基础
    MySQL insert into V.S. replace into
    Netty NIO 之 阻塞模式/非阻塞模式/多路复用
    Python 函数参数*args和**kwargs
    Netty NIO之ByteBuffer
    Python numpy 和 pandas
    Financial 协方差 Covariance
  • 原文地址:https://www.cnblogs.com/anuoruibo/p/2409355.html
Copyright © 2020-2023  润新知