精通EJB(5) 为Beans增加功能

转载 2004年09月21日 11:38:00
        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”(参考原文)
       

SSH深度历险(三) EJB Session Bean有状态和无状态的区别与联系

等等通过实例自己实践之后的清晰了很多,多动手多动手,TO Do TO DO !
  • lishehe
  • lishehe
  • 2014年06月05日 10:24
  • 3048

EJB学习笔记三(有状态和无状态SessionBean的区别)

1.前言 在EJB概述的博客中也曾提到过EJB3.0中的SessionBean的两种状态,下面呢,通过本篇博客深入的分析一下,两种状态的SessionBean到底有何区别。  2.开发一个有状...
  • ZHOUCHAOQIANG
  • ZHOUCHAOQIANG
  • 2015年07月28日 16:22
  • 2387

谈谈EJB是如何发布Web Service的

定义 我们经常会听到,xx项目中用到了Web Service。那么,什么是Web Service呢? 首先让我们来了解一下Web Service。Web Service技术,就是能使得运行在不...
  • happylee6688
  • happylee6688
  • 2014年05月19日 17:28
  • 5897

<Ejb3InAction> Sample03 for Weblogic - Session beans with lifecycle callbacks and @Resource inject

0. Prerequisite We take advantage of Weblogic attached sample db here, the data source has been co...
  • sun_xo
  • sun_xo
  • 2017年03月07日 10:33
  • 173

<Ejb3InAction> Sample03 for Glassfish - Session beans with lifecycle callbacks and @Resource inject

0. Prerequisite As sample01. 1. Customize general configuration As sample01 2. Customize...
  • sun_xo
  • sun_xo
  • 2017年04月01日 09:48
  • 201

spring源码(5)父子beans标签之间的属性关系

一、父子beans标签之间的属性关系回忆之前的一段代码:protected void doRegisterBeanDefinitions(Element root) { String prof...
  • disiwei1012
  • disiwei1012
  • 2017年07月28日 10:46
  • 230

EJB实现登录功能

环境 MyEclipse 8.6 + JBoss 6.0 + JDK 1.6.13 + EJB 3.0   问题 EJB实现登录   解决   1.       配置JBoss数据源 a)      ...
  • Wentasy
  • Wentasy
  • 2012年12月12日 17:10
  • 2034

EJB3在JBoss5内集群探究

EJB3在JBoss5x内集群探究 本文介绍ejb3在jboss5x内集群的基本配置及注意事项,我们主要的目的是在jboss5x内集群ejb3,,然后被客户端(可以是web应用程序),不涉及到jbos...
  • lvxinzhi
  • lvxinzhi
  • 2015年01月23日 19:47
  • 419

Hibernate实战_笔记5(Hibernate、EJB3、JPA)

Hibernate、EJB3和JPA简介 在用Hibernate开始第一个项目之前,应该考虑EJB3.0标准和它的子规范Java Persistence。让我们回顾历史看看这个新标准是如何产生的。 许...
  • com185272358
  • com185272358
  • 2014年03月06日 23:48
  • 712

(5) ebj学习:ejb用jpa操作数据库1

一 JPA开发持久化Bean 二 配置数据源 三 新建Ejb项目 四 指定JNDI数据源 五 编写entity bean 六 代码 1 目录结构 ...
  • jianfpeng241241
  • jianfpeng241241
  • 2016年07月13日 07:33
  • 526
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:精通EJB(5) 为Beans增加功能
举报原因:
原因补充:

(最多只允许输入30个字)