J2EE配置指南(三)
10.安全
未授权用户
对于j2ee来说,当有未授权的用户试图调用ejb container的时候,j2ee必须存在一般意义上的未授权用户存在。在j2ee中这个用户名字是guest,密码是guest123。你可以在auth.properties 文件中修改用户名和密码。
default.principal.name=guest
default.principal.password=guest123
Keystore密码
如果用户使用公钥访问https,认证信息放在/.keystore 文件中。同时user-home是System.getProperty("user.home")的返回值。
keystore是一个典型的密码文件。默认的密码是changeit。可以在web.properties 文件中修改keystore.password 属性的值来改变密码。
ANYONE 角色
在application deployment工具的security面板中,默认的情况下方法分配给ANYONE 角色。这样的结果是所有的用户和组都可以调用它。如果你没有影射到一个特定的角色,每一个用户和用户都可以调用它。可以在auth.properties 文件中设置anyone.role.name 的值来改变默认anyone角色。
钝化发生的条件:内存限制
当ejb container开始钝化一个ejb的时候,它把ejb保存在附属存储中并且试图重新分配内存。默认的情况下,如果内存使用超过128m的时候钝化开始发生。可以编辑config/default.properties 文件中passivation.threshold.memory 属性的值来修改默认值。
passivation.threshold.memory=128000000
值必须是一个正的整数。当你减少这个值的时候钝化现象回经常发生。
jndi name server host
如果jndi name server和j2ee server不在同一个机器上,你必须改变config/orb.properties 文件中host属性的值。
host=localhost
HTTP 文档根
默认的情况下,http和https服务的文档是public_html。你可以编辑web.properties 文件中documentroot属性的值来改变它。
documentroot=public_html/
JavaTM 2 SDK,Enterprise Edition 介绍
1.注意事项
如果你第一次使用JavaTM 2 SDK, Enterprise Edition (J2EE SDK) ,你应该遵从下面的步骤:
(1)确认你安装了JavaTM 2 SDK, Enterprise Edition (J2EE SDK) 。
(2)配置你的JavaTM 2 SDK, Enterprise Edition (J2EE SDK) 软件。
(3)阅读 《开始j2ee》文档,开始建立年的ejb。
2.支持的平台
SolarisTM Operating Environment, version 2.6
Windows NT, version 4.0
3.支持的数据库和jdbc 驱动
这个版本支持jdbc api的1.0和2.0版本的数据库驱动。我们在以下数据库上做了很好的测试:
Oracle8 Server, version 8.05
Microsoft SQL Server, versions 6.5, 7.0
Cloudscape, version 3.0
更多的jdbc信息,请参阅jdbc data access api web页面("http://www.java.sun.com/products/jdbc/index.html)。观看驱动提供商列表请看http://www.java.sun.com/products/jdbc/jdbc.driver.html。当你安装完驱动后,你要按照《配置指南》中有关jdbc 驱动的内容进行配置。如果你使用cloudscape 数据库,你不需要配置它的驱动,因为在本版本已经包括了它的驱动。
4.本版本的内容包括:
服务:
EJB
HTTP
HTTP over SSL
COS naming
Authentication
工具:
Application Deployment Tool
一个打包j2ee组件和发布应用程序的工具。
Realm Tool
这个工具管理j2ee server 的用户。
Verifier
这个工具核实j2ee组件文件。
Packager
这个工具打包j2ee组件。
Cleanup Script
删除所有发布的j2ee的应用程序。
Cloudscape 数据库
本版本包括一个用java语言写的关系型数据库——cloudscape 3.0。尽管本文档例子的代码是用cloudscape做测试的,但是你可以使用任何本版本支持的数据库。
对企业的java apis
Enterprise JavaBeans API, version 1.1
Java Servlets, version 2.2
JavaServer Pages technology, version 1.1
JDBC Standard Extension, version 2.0
Java Naming and Directory InterfaceTM API, version 1.2 (CosNaming SPI)
RMI/IIOP
Java Transaction API, version 1.0
JavaMail API, version 1.1
Java Messaging Service, version 1.0 (API only, no implementation)
5.需要的软件。
首先,你需要安装JDK 1.2 。The JavaTM 2 SDK, Standard Edition 提供了运行和建立j2ee应用程序的能力。如果你的client在另外一个机器上,client上也必须安装jdk1.2。
能支持j2ee的jdk1.2如下:
http://www.java.sun.com/products/jdk/1.2/download-solaris.htm
http://www.sun.com/solaris/java
http://www.java.sun.com/products/jdk/1.2/download-windows.html
其他版本的jdk1.2没有做过测试,并且不支持j2ee。
注意:jdk1.2中不能安装 The RMI-IIOP standard extension 。
6.当前的缺陷。
本版本的目的是向你介绍j2ee技术,给你提供一个向我们反馈信息的机会,以便我们以后做的更好。本版本中有几个缺陷。
1.Container-Managed Persistence
实现基于container-managed persistence 的entity beans不能完全实现所有的把物体影射到关系型数据库的特性。
entity bean 类只能影射到一个数据库中的表一个container-managed field 只能影射到一个表中的字段当容器装入container-managed fields 的时候,它回装入所有的container-managed fields 。当装入的数据非常大的时候,性能回受到影响。因为有些数据是商业方法所不需要的。
如果多个entity beans 的container-managed fields影射到数据库中同一个数据的时候,并且如果这些beans在同一个事务中被引用,他们可能会对数据的一致性造成影响。
在ejbCreate, ejbRemove, ejbLoad, and ejbStore 方法中包含sql语句的beans中,当用deploytool分布它们的时候,你只能修改表和字段的名字,不能修改作为参数传入的数目和它们的顺序。
在sql 语句中不能调用存储过程。
在Create Table语句中,你可以更改表的字段的sql类型,以便和实际的数据类型相符。
所有发生起来语句中的表名和字段的名字必须一致。
通常的sql语句只在Cloudscape, Oracle, and Microsoft SQL Server上做了测试,其他的数据库你应该自己测试。
重复进行Result Set 时进行数据库调用
对于一些数据库的驱动而言,在重复进行Result Set 时不能连接数据库。在下面的例子中,thestmt.executeUpdate 会失败。
String query = "SELECT DEPTNO FROM DEPT . . .";
String update = "UPDATE EMPLOYEE . . .";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
String s = rs.getString("DEPTNO");
// The following statement will FAIL:
stmt.executeUpdate(update);
. . .
}
你可以通过以下几种方法绕开此限制:
1.使用一个包含次sql的存储过程。
2.把重复的语句定义成一个子查询,例如:
String update = "UPDATE EMPLOYEE
SET DEPTNO =
(SELECT DEPTNO FROM DEPT
WHERE LOC = `ATLANTA’)
WHERE TITLE = `ENGINEER’";
3.把第二个sql语句放在另外一个方法中,然后调用另外一个方法,在这种情况下,必须注意另外一个的方法事RequiresNew类型的事务。同时一应该注意第二个sql语句运行在另外的事务中。这样,如果第二个事物失败的话,你应该使第一个事物回滚。
强壮性和内存问题
我们预期在j2ee的server运行在内存小于128m的系统中,或者deploy的j2ee应用程序数目大于16的时候,或者几千个jeb实例化的时候,系统会出现问题。如果你的内存溢出,shutdown并且重新启动j2ee server。
通常的分布环境
在这个版本中,每一个develper应该工作在自己的j2ee sdk环境中。多个developer不能共享一个j2ee server。
已知的bug分布的bug
1.在寻找一个 web resource collectin 时键入url后应该键入回车以便确认数据已经发送
2.当gui界面中的edit菜单被选中的情况:典型的情况时:树型结构看起来象是已经被选中,实际上另外一个组件被选中了。因此,edit操作会对另外一个组件进行操作。
3.对于一个有很长的内容列表的组件连说,你有可能在打包的过程中遇到命令行的参数长度的限制。避免的方法:把帮助的类加入到一个.jar库文件中,然后把这个.jar文件加入到应用程序的.ear文件中。
4.如果在一个含有ejb .jar文件的企业bean中有jndi名字,然后一个新的bean添加到这个同样的.jar文件中。jndi的名字数据可能丢失。解决的方法:尽量在指定jndi名字之前完成ejb .jar文件。
5.在新建一个ejb的向导的通用对话框中,类的名称有可能丢失。丢失的情况发生在你后退然后前进的动作中。
6.当你在核实的过程中新增文件的时候,有时候文件选择的状态有可能不正确。使用文件选择器选择一个目录后,你可能没有新增正确的文件。解决的方法:通过在另外一个工具的中引用这个文件,来刷新cache。例如:从file菜单,选择add ejb jar到应用程序,click 取消,然后到核实的对话框中。
7.杂新增企业bean的响动中,如果选择了错误的类,然后你回退选择正确的项目,有时候这个选择的类的container-managed persistence属性有可能不正确。解决的方法:或者重新启动向导,或者选择另外一种类型的bean。
安全问题的bug
当用户重新定向到基于窗体的对话框页面的时候,如果没有注册(比如选择了浏览器的back),于是会被拒绝。解决的方法:从新启动浏览器。
jsp的bug
在特定的条件下,server启动的时候加载servlets有可能失败。j2ee server启动的时候可以加载一个servlet并且调用这个servlet的init方法。但是结果是不可预料的。这些加载的servlets包括在web.xml文件的
RMI-IIOP Bugs
1.如果你的jdk安装了RMI-IIOP部分,j2ee将不能工作。解决的办法是安装一个干净的jdk。
2.j2ee的客户和server不能在基于IIOP1.0 协议的orb的产品中实现。
其他软件的bug
1. 在solaris平台上,如果环境变量没有包括setenv JIT_ARGS="bco=off",j2ee jit将会引起cloudscape的失败。
2. 在切换j2ee server从non-recoverable 的模式到recoverable模式之前,要注意首先运行cleanup脚本。
3. 运行j2ee,jdk是十分必要的。在一些系统中当安装jdk是时候,用户可以选择stand-alone JRE的模式。
这样的模式不能运行j2ee。另外一个问题是:如果jre的root设置成jdk的安装目录,错误有可能发生。在这种情况下,当你运行的时候一切是好的,但是deploy的时候,会有如下错误:
java.rmi.RemoteException: Error processing ejb jar:access denied:
(java.io.FilePermission e:\testjava\lib\ext read)
4. 当https服务没有启动的时候,j2ee server会打印一个错误,你可以忽略如果你不需要https。
5. 在企业bean中,如果父类的参数或者返回值不是serializabl的,在父类中不要调用deserialization。要确定所有的父类是serializable。
6. web组件的server.policy 文件和j2ee要符合。这个文件给出了
${com.sun.enterprise.home}/public_htm/ 下的权限。应用这个文件,遵从下面的步骤:
a:在lib/security/server.policy文件中,删除下面的行:
grant codeBase "file:${com.sun.enterprise.home}/public_html/-" {
permission java.security.AllPermission;
}
b:替换删除的行的内容如下:
grant codeBase "file:${com.sun.enterprise.home}/public_html/-" {
permission java.lang.RuntimePermission "loadLibrary.*";
permission java.lang.RuntimePermission "accessClassInPackage.*";
permission java.lang.RuntimePermission "queuePrintJob";
permission java.lang.RuntimePermission "modifyThreadGroup";
permission java.io.FilePermission "<>", "read,write";
permission java.net.SocketPermission "*", "connect";
// "standard" properies that can be read by anyone
permission java.util.PropertyPermission "*", "read";
// set the JSSE provider for lazy authentication of app. clients.
permission java.security.SecurityPermission "putProviderProperty.JSSE";
permission java.security.SecurityPermission "insertProvider.JSSE";
};