EJB 中的应用程序与容器身份验证
Application vs Container authentication in EJB
我对 EJB 比较陌生,正在处理一个使用 EJB2.0 的维护应用程序。我只是浏览应用程序代码并试图理解它。它有 ejb-jar.xml 和一些会话 bean,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>StatelessBean</ejb-name>
<home>com.example.interfaces.StatelessBeanHome</home>
<remote>com.example.interfaces.StatelessBean</remote>
<local-home>com.example.interfaces.StatelessBeanLocalHome</local-home>
<local>com.example.interfaces.StatelessBeanLocal</local>
<ejb-class>com.example.interfaces.StatelessBeanSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<security-identity>
<use-caller-identity>
</security-identity>
<resource-ref>
<res-ref-name>eis/SAPFactory</res-ref-name>
<res-type>javax.resource.cci.ConnectionFactory</res-type>
<res-auth>Application</res-auth>
<re-sharing-scope>Shareable</re-sharing-scope>
</resource-ref>
</session>
</enterprise-beans>
</ejb-jar>
我看到资源验证可以是 Application 或 Container,在上面的代码片段中是 Application,在其他一些应用程序中我看到它被称为Container,它们之间到底有什么区别?什么时候使用其他。另外,交易类型也被指定为Container,请也说明一下。
<res-auth>Application</res-auth>
表示应用程序将执行对资源的登录。例如,对于 JDBC,这意味着应用程序将使用 getConnection(user, password)
。 <res-auth>Container</res-auth>
允许应用程序服务器提供登录凭据,通常是通过服务器管理员提供的配置。容器管理的身份验证通常是首选,以避免在应用程序中硬编码 user/password 信息或需要发明一种辅助机制来为应用程序提供配置。
对于 EJB,<transaction-type>Container</transaction-type>
意味着默认情况下 EJB 容器将在调用 EJB 方法时隐式开始事务,而在 EJB 方法结束时 commit/rollback(取决于抛出的异常)。此外,每个方法的事务属性可用于修改容器管理事务的行为(调用方法时 suspend/reject 个现有事务,并选择根本不启动全局事务)。 <transaction-type>Bean</transaction-type>
表示 EJB 必须使用 UserTransaction
.
开始/commit/rollback 本身
我对 EJB 比较陌生,正在处理一个使用 EJB2.0 的维护应用程序。我只是浏览应用程序代码并试图理解它。它有 ejb-jar.xml 和一些会话 bean,如下所示。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans
2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
<ejb-jar>
<enterprise-beans>
<session>
<ejb-name>StatelessBean</ejb-name>
<home>com.example.interfaces.StatelessBeanHome</home>
<remote>com.example.interfaces.StatelessBean</remote>
<local-home>com.example.interfaces.StatelessBeanLocalHome</local-home>
<local>com.example.interfaces.StatelessBeanLocal</local>
<ejb-class>com.example.interfaces.StatelessBeanSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<security-identity>
<use-caller-identity>
</security-identity>
<resource-ref>
<res-ref-name>eis/SAPFactory</res-ref-name>
<res-type>javax.resource.cci.ConnectionFactory</res-type>
<res-auth>Application</res-auth>
<re-sharing-scope>Shareable</re-sharing-scope>
</resource-ref>
</session>
</enterprise-beans>
</ejb-jar>
我看到资源验证可以是 Application 或 Container,在上面的代码片段中是 Application,在其他一些应用程序中我看到它被称为Container,它们之间到底有什么区别?什么时候使用其他。另外,交易类型也被指定为Container,请也说明一下。
<res-auth>Application</res-auth>
表示应用程序将执行对资源的登录。例如,对于 JDBC,这意味着应用程序将使用 getConnection(user, password)
。 <res-auth>Container</res-auth>
允许应用程序服务器提供登录凭据,通常是通过服务器管理员提供的配置。容器管理的身份验证通常是首选,以避免在应用程序中硬编码 user/password 信息或需要发明一种辅助机制来为应用程序提供配置。
<transaction-type>Container</transaction-type>
意味着默认情况下 EJB 容器将在调用 EJB 方法时隐式开始事务,而在 EJB 方法结束时 commit/rollback(取决于抛出的异常)。此外,每个方法的事务属性可用于修改容器管理事务的行为(调用方法时 suspend/reject 个现有事务,并选择根本不启动全局事务)。 <transaction-type>Bean</transaction-type>
表示 EJB 必须使用 UserTransaction
.