410 likes | 584 Views
以下内容旨在概述产品的总体发展方向 。 该内容仅供参考,不可纳入任何合同 。 该内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据 。 此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定 。. 轻松用于嵌入式设备的中间件. Stephen Chin (@steveonjava) Java 技术大使 JavaOne 大会内容主席. 议题. Oracle Java Embedded Suite 的组件 针对 Java Embedded Suite 开发应用程序 代码示例 演示.
E N D
以下内容旨在概述产品的总体发展方向。该内容仅供参考,不可纳入任何合同。该内容不构成提供任何材料、代码或功能的承诺,并且不应该作为制定购买决策的依据。此处所述有关 Oracle 产品的任何特性或功能的开发、发布以及相应的日程安排均由 Oracle 自行决定。
轻松用于嵌入式设备的中间件 Stephen Chin (@steveonjava) Java 技术大使 JavaOne 大会内容主席
议题 • Oracle Java Embedded Suite 的组件 • 针对 Java Embedded Suite 开发应用程序 • 代码示例 • 演示
Oracle Java Embedded Suite • 将 Java EE 技术引入嵌入式网关设备 • 轻松创建和托管 Web 应用程序和服务 • Java 运行时和中间件 • Java SE Embedded • 适用于 Embedded Suite 的 GlassFish • Java DB • Jersey • 提供全面的集成、测试和支持 • ARM Linux 和 x86 Linux
Java SE Embedded • 有/无图形界面的Java SE配置 • 针对嵌入式应用进行了优化 • 熟悉的 Java SE 7 API 集 • 使用自己喜欢的 IDE 和库 • 初始版本中包含 7u6 JRE • 客户端 JIT • 针对 x86 和 ARM V6/V7 进行了优化
适用于 Embedded Suite 的 GlassFish • 应用服务器 • 针对在嵌入式设备中使用而减少了大小 • 在嵌入式模式下运行(即在进程中) • 使用嵌入式 GlassFish API 控制 • HTTP 服务器 • Servlet 3.0 容器 • Java DB 和 Jersey 集成
Java DB • 功能齐全的多用户 RDBMS,包括崩溃恢复 • 易于使用 - 无需 DBA • 基于标准(ANSI/ISO SQL 和 JDBC) • Apache Derby 项目 • 活跃的开发人员和用户社区 • 成熟的代码库(超过 15 年的实战经验)
Java DB - 易于使用 • 单个 jar • 熟悉而广泛的 SQL 支持 • 自调优 • 优化器统计信息、页面大小和锁定默认值 • 许多特性均可插拔 • 加密、身份验证、函数、过程、数据类型…… • 使用嵌入式 JDBC 数据源
Java DB 专题讲座 • 专题讲座 ID:CON6684 专题讲座标题:嵌入式中间件的数据存储 讲座地点/场地:Hotel Nikko - Monterey I/II 日期和时间:星期四 14:00
Jersey • REST 式 Web 服务框架 • JSR-311 (JAX-RS) 参考实现 • 基于批注 • 使实现 REST 式 Web 服务变得容易 • 包括 JSON 支持 • 另外还提供 REST 客户端 API
JES 应用程序 主要 应用程序 静态 内容 Web 应用程序/服务 Jersey JavaDB GlassFish Java SE Embedded
Hello Jersey // The Java class will be hosted at the URI path "/helloworld" @Path("/helloworld") public class HelloWorldResource { // The method will process HTTP GET requests @GET // The method will produce content encoded as MIME type "text/plain" @Produces("text/plain") public String getClichedMessage() { return "Hello World"; } }
嵌入式 GlassFish API • 生命周期操作 — 启动和停止应用服务器 • 部署和取消部署应用程序 • 运行时配置 • 访问服务
嵌入式 GlassFish API 示例 GlassFishRuntimegfRuntime = GlassFishRuntime.bootstrap(); GlassFishPropertiesgfProps = new GlassFishProperties(); gfProps.setPort("http-listener", port); gfProps.setPort("https-listener", port + 1); GlassFishglassfish = gfRuntime.newGlassFish(gfProps); glassfish.start(); Deployerdeployer = glassfish.getDeployer();
保护设备 • 免责声明:这不是完整的安全教程 • 您应当了解如何保护 Linux 安装 • 移除不需要的服务 • 只打开需要的端口 • 审核文件权限 • … • 我们来谈谈如何确保安全访问 Web 应用程序
GlassFish 安全性 • 在概念上,与“Big GlassFish”的配置相同 • 无管理控制台 • 因此没有开放的端口 • 使用嵌入式 API 进行配置 • 除非您自行配置,不应留有任何 HTTP & HTTPS 监听器 • 启动嵌入式 GlassFish 实例时使用属性
配置安全传输 • 可能需要使用 HTTPS • HTTP 随后将重定向至 HTTPS • 将 <transport-guarantee> 添加到 web.xml 中 • 或 • 对 servlet 使用 @ServletSecurity • 对 Jersey 使用 @Context 批注和 SecurityContext.isSecure()
配置安全传输 (2) <security-constraint> <web-resource-collection> <web-resource-name>Admin Pages</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <user-data-constraint> <description/> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
限制对 Web 应用程序的访问 • GlassFish 可通过以下方式对用户进行身份验证: • 用户名和口令 • 证书 • 上述两项组合 • 身份验证领域 - 文件、证书、JDBC、LDAP • 可以为以下各项创建自定义领域和 LoginModule • 其他身份验证机制 • 其他安全性措施,如每用户口令 Salt
使用 JDBC 领域 • 创建 JDBC 领域 • 指定使用 JDBC 领域 • 将角色与组关联,并指定角色约束 • 定义用户数据库模式 • 填充用户数据库 • 指定访问约束 • 编写自定义 LoginModule?
创建 JDBC 资源 • 通常使用GlassFish管理控制台执行此操作 • 或使用asadmin命令 • 可通过CommandRunner API 运行asadmin命令 CommandRunner runner = glassfish.getCommandRunner(); CommandResult result; result = runner.run("create-jdbc-resource”, "--connectionpoolid=DerbyPool”, "jdbc/derby");
创建 JDBC 领域 result = runner.run("create-auth-realm”, ”--classname=com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm", "--property=jaas-context=jdbcRealm: encoding=Hex: password-column=PASSWORD: datasource-jndi=jdbc/__default: group-table=users_groups: user-table=users: group-name-column=GROUPID: digest-algorithm=MD5: user-name-column=USERID”, "MyJDBCRealm");
指定使用 JDBC 领域 • 在 web.xml 中,添加 <login-config> <auth-method>BASIC</auth-method> <realm-name>MyJDBCRealm</realm-name> </login-config>
将角色与组关联 • 在 sun-web.xml 中,添加 <security-role-mapping> <role-name>admin</role-name> <group-name>admin</group-name> </security-role-mapping>
指定角色约束 • 在 web.xml 中,添加 <security-role> <role-name>admin</role-name> </security-role>
指定角色约束 (2) • 在 web.xml 中,添加 <security-constraint> … <auth-constraint> <role-name> admin </role-name> </auth-constraint> </security-constraint>
配置角色约束 <security-constraint> <web-resource-collection> <web-resource-name>Admin Pages</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>
定义用户数据库模式 Statement s = connection.createStatement(); s.execute("CREATE TABLE users" + ”(USERID varchar(50) NOT NULL, PASSWORD varchar(128) NOT NULL)”); s.execute("CREATE TABLE groups" + ”(GROUPID varchar(20) NOT NULL)"); s.execute("CREATE TABLE users_groups" + ”(GROUPID varchar(20) NOT NULL, USERID varchar(50) NOT NULL”)");
填充用户数据库 s.execute(“INSERT INTO users(USERID,PASSWORD) VALUES(‘user’,’…’)”); s.execute("INSERT INTO users(USERID,PASSWORD) VALUES ('user', ‘…’)”); s.execute("INSERT INTO groups(GROUPID) VALUES ('admin')"); s.execute("INSERT INTO groups(GROUPID) VALUES ('users')"); s.execute("INSERT INTO users_groups(USERID,GROUPID) VALUES ('adminuser', 'users')"); s.execute("INSERT INTO users_groups(USERID,GROUPID) VALUES ('adminuser', 'admin')"); s.execute("INSERT INTO users_groups(USERID,GROUPID) VALUES ('user', 'users')");
在设备中包含 JES • 只需将 JES 目录放置在设备上的任意所需位置 • 无需安装过程 • 嵌入式 GlassFish 将创建一个框架工作树 • 默认在 /tmp 下 • 您的应用程序可能需要“冷启动” • 初始化凭证存储 • 将预初始化的数据库复制到所需位置 • ……
准备好开始了吗? 直接访问以下网址进行下载: http://www.oracle.com/technetwork/java/embedded/downloads/java-embedded-suite/index.html
应用程序打包 • Web 应用程序和服务打包为 war 文件 • Jar 文件和其他应用程序描述文件 • WEB-INF/web.xml • WEB-INF/sun-web.xml
访问受保护的资源 GlassFish 容器 请求资源 Web 浏览器 请求凭证 检查 凭证 发送凭证 Web 应用程序 返回资源 用户 信息
Web 服务安全性 • javax.ws.rs.core.SecurityContext • 获取关于连接和用户的信息 • 使用 @Context 标注注入此信息 @Context SecurityContext security; String username = security.getUserPrincipal().getName(); if (security.userInRole(“admin”)) { … }
使用 Netbeans 开发 • 自动下载和执行应用程序 • 使用Netbeans提供的 <scp> 和 <sshexec> Ant 规则 • 更新 build.xml 中的 <run> 目标