科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道使用 Lotus Domino Toolkit for WebSphere Studio 集成 Amazon Web Services

使用 Lotus Domino Toolkit for WebSphere Studio 集成 Amazon Web Services

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

这是由三部分组成的系列文章的第 3 部分:本文介绍如何使用 Lotus Domino Toolkit for WebSphere Studio 来创建一个使用在本系列文章第 1 部分中创建的 Domino 数据库的 Web 服务应用程序.

作者:www.ibm.com 来源:www.ibm.com 2007年9月15日

关键字: 技巧 IBM Domino lotus Office

  • 评论
  • 分享微博
  • 分享邮件

如果您一直在跟踪本系列文章,应该会记得我们的第一篇 LDD Today 文章“使用 Notes 数据库集成 Amazon Web Services”。在这篇文章中,我们介绍了如何在一个 Domino 应用程序中集成 Amazon Web Services 来查询 Amazon.com 的搜索引擎。在本系列的第 2 部分中,我们介绍了如何使用 JSP 和其他 J2EE 技术来构建相同的应用程序。在本系列的第 3 部分中,我们将使用 Lotus Domino Toolkit for WebSphere Studio 来创建一个使用在本系列文章的第 1 部分中创建的 Domino 数据库的 Web 应用程序。使用 Lotus Domino Toolkit for WebSphere Studio 创建的应用程序可以在任何可以支持 JSP 和 servlet 的 J2EE 子集的服务器上运行,包括 WebSphere Express 和 Apache Tomcat。

Lotus Domino Toolkit for WebSphere Studio 包括用来访问各种 Domino 对象的 Domino 定制 JSP 标签;这些标签都可以与 WebSphere Studio 进行集成。(这个工具包尚不能在 Eclipse 中使用,尽管 WebSphere Studio 是基于 Eclipse 框架的;这是因为这个工具包使用了 WebSphere Studio 的一部分特性。)与 WebSphere Studio 进行的集成可以让您打开一个 Domino 数据库,并将 Domino 的设计元素拖拽到 WebSphere Studio 中的 JSP 上;集成过程会自动生成正确的 JSP 定制标签,因此您就不必担心生成语法的正确性问题。在本文中,我们将介绍这种集成如何让您创建一个 Web 应用程序,用于显示通过 Amazon Web Services 加载的数据库中的 Amazon.com 书籍的信息,并让您作为管理员对文档进行分类。

您可以从 Sandbox 下载本文使用的示例代码。

应用程序结构

正如您在本系列文章的第 2 部分“使用 JSP 集成 Amazon Web Services”所看到的一样,您需要编写一些程序来实现使用 Domino 服务器作为 Web 上的数据库时所实现的功能,包括视图的分页、登录和文档编辑功能。您可以这样对视图分别进行编辑:将 Web 站点划分为对所有用户都是可见的不同部分,以及另外一个只有管理员才可以编辑/删除文档的单独部分(在本例中,是到 Amazon.com 书籍的链接)。注意,由于数据都是保存在一个 Domino 数据库中的,因此您可以在 Lotus Notes 客户机中进行编辑来节省大量的开发时间。然而,为了完整性,本文还将介绍如何使用 Domino 定制 JSP 标签构建管理员部分。

如果您要按照本文的介绍逐步进行实验,可以使用两种安全技术来创建一个应用程序,这些技术可以保证该应用程序的可移植性:会话变量和容器管理的安全性(也就是声明性安全性)。会话变量技术的移植性最好,这是因为它对 J2EE 服务器的要求很少;实际上,它被广泛地在其他 Web 开发环境中使用,从 ASP 到 Cold Fusion 再到 PHP。当一个用户完成一个登录表单时,就会查询该用户的认证信息,并将用户名和角色保存在服务器上该用户的会话中;如果这个会话信息不存在,那么这个用户就还没有登录。在 Domino 中使用这种技术的优点之一是,您可以查询某个用户在他试图访问的 Notes/Domino 数据库中的角色,而不是他在 J2EE Web 应用程序中的角色。这种技术的缺点是,必须在所有“安全”页面的顶部包括一些代码用于进行登录的有效性验证;如果没有这样处理,那么任何用户都可以访问这个页面。

顾名思义,容器管理的安全性是由运行应用程序的 J2EE 服务器进行管理的。在您的 Web 应用程序的 web.xml 文件中,您可以声明哪些角色可以使用您的应用程序,哪些 URL 是安全的,要使用安全的 URL 需要具备哪些用户角色。用户和角色的管理是在 J2EE 服务器的管理工具中进行控制的。由于 Notes/Domino 数据库都使用 Domino 安全性进行了安全处理,即使有一个角色被分配给了 J2EE 服务器中的某个用户,这个可以编辑 Notes/Domino 文档的用户也必须具有访问数据库的有效权限,所以在使用 Domino 定制 JSP 标签时,就具有了额外的一层安全性。

我们的 Web 应用程序需要的 JSP 包括:

JSP 说明
login.jsp 会话变量安全性使用的登录页面
doLogin.jsp 处理实际登录过程的页面,如果成功就返回 index.jsp,如果失败就返回 login.jsp
logout.jsp 用来刷新所有与登录有关的会话变量的注销页面
index.jsp 只读视图,用来为非管理员用户显示处于 Added 状态的书籍
showBook.jsp 查看书籍的页面
checkLogin.jsp 所有需要会话变量安全性的页面都需要包含它;在容器管理的安全性中用来将登录信息加载到与会话变量安全性相同的会话变量中
admin/index.jsp 书籍的管理员视图,可以删除书籍以及显示每种状态下的书籍
admin/editBook.jsp 编辑书籍的页面,只有管理员可以使用




回页首


在 WebSphere Studio 中创建一个 Web 应用程序

本节假设您已经安装了 Lotus Domino Toolkit for WebSphere Studio。您可以下载 Lotus Domino Toolkit for WebSphere Studio 的最新版。

注意:在撰写本文时,Lotus Domino Toolkit for WebSphere Studio 的 Beta 版本中包括了 Domino 定制 JSP 标签,这些标签在除 WebSphere 之外的其他 J2EE 服务器上并不能全部工作(尤其是 form/field 标签)。希望这只是 Beta 版本的一个 bug,而不是 WebSphere 上的硬编码依赖性,这样 Lotus 就可以在所有的 J2EE 服务器上使用 Domino 定制 JSP 标签了。

在安装这个工具包之后,请打开 WebSphere Studio 并创建一个新 Web 项目。确保在 Web Project features 窗口中选择了 Include Domino Custom Tags Library 选项。当您创建项目时,Domino Toolkit 会自动使用 Domino 定制标签的标签库(TLD)文件配置您的项目,并将必需的 Domino 定制 JSP 标签 JAR 文件添加到该项目的类路径中。

创建 JSP

现在您已经准备好创建第一个 JSP 了。选择 File - New 新建一个 JSP。检查位置确保正确:


图 1. New JSP File 对话框
New JSP File 对话框

单击 Next 并从 Select a Tag Library 对话框中选择 Domino JSP 定制标签库。

注意: 在选中这个复选框之前,您需要先输入前缀;前缀域位于这个复选框之后,这可能会有点容易引起混淆。设置完成之后,单击 Next 或 Finish,页面的其他选项使用默认值。WebSphere Studio 生成一个启动页面,其中包括对页面进行初始化的标签、一个风格页面引用以及所包含的标签库。

现在您可以添加一个新的 Domino 视图了。首先选择 Window - Show View - Other,并选择 Domino,打开 Domino 数据库浏览器面板。单击 new database 菜单项,输入 Domino 服务器的名字(DIIOP 任务必须正在这个 Domino 服务器上运行),登录使用的用户名以及您在本系列文章第 1 部分创建的 AmazonWS.nsf 数据库。


图 2. Domino Database Connection 对话框
Domino Database Connection 对话框

将光标移到 </BODY> 标签上,打开 AmzonWS.nsf 数据库的 Domino 数据库浏览器。找到 Books\by Status 视图。右击该视图并从菜单中选择 “Add form/view to Web Page”。WebSphere Studio 会插入适当的 JSP 标签以在 JSP 中显示 Domino 视图。您也可以将这个视图拖拽到 JSP 上,但是要注意这个视图插入的地方是您的鼠标所在的位置,而不是您所拖到的视图上。下面是所得到的样子:


图 3. Index.jsp
Index.jsp

现在您可以看一下这个视图的结果了;但是不要使用 JSP 编辑器中的 Preview 附签。这只会显示静态 HTML 的内容,当您在页面中使用了定制 JSP 标签时,通常没什么用处。相反,查看一下左边项目文件层次结构面板的内容,然后右击这个 JSP 文件,并选择 Run On Server。选择 WebSphere Test Environment(这另外需要 145 MB 的内存,因此您的系统中至少需要有 768 MB 内存,否则速度就会非常慢)。在完成设置之后,您就可以尝试体验第一次使用 Domino JSP 定制标签库的乐趣了:


图 4. Web 浏览器中显示的 Index.jsp
Web 浏览器中显示的 Index.jsp

虽然它在视图中显示了所有的内容,但是 WebSphere Studio Domino 定制 JSP 标签进程所生成的代码具有一些限制。您需要添加实现分类处理(替换 Notes 中对应的功能)和视图分页功能的代码。

对视图进行分页

首先,让我们为视图添加分页功能。您可以通过向 index.jsp 文件中添加下面的黑体显示的代码实现这种功能:

				<domino:page id="pagelist" rows="10">
<domino:viewloop> 
  <tr> 
    <td><font color="dark blue" face="Helvetica"><domino:viewitem 
    col="1"/></font></td>
    <td><font color="dark cyan" face="Helvetica"><domino:viewitem 
    col="2"/></font></td>
    <td><font color="black" face="Helvetica"><domino:viewitem 
    col="3"/></font></td>
  </tr>
</domino:viewloop>
<domino:pageprev/> Page <%=pagelist.getPage()%> of <%
=pagelist.getPageCount()%>
<domino:pagenext/><br>
</domino:page>
			

第一个标签为视图添加显示时的分页功能。如果您目前不是在第一页上,<domino:pageprev/> 标签就会自动添加一个 Previous 链接。如果还有其他页,<domino:pagenext/> 标签就会自动添加一个 Next 链接。这些链接在第一页和最后一页时会隐藏起来。不幸的是,在撰写本文时,我们还不能说 <domino:pagefirst/> 和 <domino:pagelast/> 标签已经实现了。您可以在 <domino:pagenext/> 标签后面添加一些代码来隐藏这些链接:

<% if (pagelist.getPage() != 1) { %>    
	<domino:pagefirst/>    
<% } if (pagelist.getPage() != pagelist.getPageCount()) { %>    
	<domino:pagelast/>    
<% } %>

正如您可以看到的一样,您可以在同一个页面中混合使用 Java 和 Domino 定制 JSP 标签,尽管通常都不推荐这样使用,因为这会使 JSP 更加难以维护,而且可读性也会变差。我们可以使用 Domutil 标签库来替代 Java 的 if 语句,从而避免匹配 Java 括号的问题,但是这需要很多行代码:

<domutil:if>    
    <domutil:condition>    
    <%=pagelist.getPage() != 1%>    
    </domutil:condition>    
<domino:pagefirst/>    
</domutil:if>    
<domutil:if>    
    <domutil:condition>    
    <%=pagelist.getPage() != pagelist.getPageCount()%>    
</domutil:condition>    
<domino:pagelast/>    
</domutil:if>

为视图添加搜索功能

使用 Domino 作为后端数据库来为 Web 站点存储信息的最大原因是全文搜索功能是 Lotus Notes/Domino 的基本功能之一。为视图添加这种搜索功能非常简单。在 index.jsp 页面的 <BODY> 标签之后,添加下面的 Java 代码:

<%
    String searchstring = request.getParameter("search");    
    if (searchstring == "") {	
    // domino:view tag blows up if you feed it a blank search string    
    searchstring = null;    
    }    
    String searchdefault = searchstring;    
    if (searchdefault == null) {    
    searchdefault = "";    
    }
%>

这段代码创建两个变量,后面会使用这两个变量在页面中启用搜索功能。<domino:view> 标签有一个 ftsearch 参数。通过将这个参数添加到 <domino:view> 标签中,这个视图就成为可搜索的,如黑体所示:

host="SlipGate"ftsearch="<%=searchstring%>">
			

最后,在 </domino:view> 标签之后,添加下面这个小的搜索表单:

    <domino:preserve name="search"/>    
    <form method="get" action="index.jsp">Search: <input     
    name="search" value="<%= searchdefault %>"></form>

注意 <domino:preserve> 标记的用法。Domino 定制 JSP 标签隐藏了一部分分页实现的功能,它通过使用隐藏的参数来调用 URL 从而进行分页。通过使用 <domino:preserve> 标签,您可以告诉 Domino 定制 JSP 标签在为视图分页生成自己的 URL 时依然保留这个参数。在我们的例子中,如果一个用户正在搜索 Sams,并点击了下一页,那么您就会希望下一页的内容是搜索 Sams 的下一个结果集,而不是没有任何搜索条件的下一页视图。下面是使用了搜索功能后 Web 页面的样子:


图 5. 具有搜索框的 Index.jsp
具有搜索框的 Index.jsp

将文档链接到视图中

既然得到了一个匿名用户可以使用的表单,接下来需要添加到每个视图的链接,这样用户就可以查看每本书的详细信息了。这可以简单地使用 <domino:formlink> 标签做到。您所需要做的事情是在附签中包含每个视图项的适当列,并链接到设计用来显示文档的 JSP:

				<domino:formlink href="showBook.jsp">	<domino:viewitem col="3"/>
<domino:formlink></font></td>
			

在完成这些设置之后,就可以在浏览器中显示这个视图页面了,它应该类似于下图所示:


图 6. 具有文档链接的 Index.jsp
具有文档链接的 Index.jsp

在这个页面中,它生成的 URL 类似于 showBook.jsp?unid=<docunid>,其中 <docunid> 是一个唯一的文档 ID,这也正是我们在 Notes 中所熟知并且喜欢的一个部分。

显示文档的详细信息

按照上面生成 index.jsp 的步骤创建 showBook.jsp 文件。在创建 showBook.jsp 之后,就可以在 WebSphere Studio 中打开相同的 Domino 数据库浏览器,并将 Book 表单从 Notes 数据库拖拽到 JSP 中。Domino Toolkit 会自动生成一些代码来显示该表单中所有的域,因此它将如下所示:


图 7. 带有表单代码的 Index.jsp
带有表单代码的 Index.jsp

<domino:form> 标签的默认值是以读模式显示该文档,而不是以写模式显示该文档。您应该还要添加一个链接来让用户回退前一页视图;这可以通过在 </BODY> 标签之前添加下面的代码来实现:

<a href="index.jsp" onClick="javascript:history.go(-1)">Back</a> 

现在您就可以在测试服务器上运行 index.jsp 文件并点击视图中的链接了。在浏览器中显示的书籍文档如下所示:


图 8. Book 文档
Book 文档

创建管理页面

现在您已经完成了基本的视图和文档的设计,接下来可以重点设计管理页面了,它可以基于前面工作的基础上进行。在项目的 Web 内容目录中创建一个 admin 子文件夹。将 index.jsp 和 showBook.jsp 文件拷贝到这个新目录中,然后将 showBook.jsp 重命名为 editBook.jsp。

为视图添加删除功能

添加删除文档的功能非常简单,因为可以使用 Domino 定制 JSP 标签。首先,允许标签为每个视图项生成选择复选框。这可以通过在 index.jsp 中添加 <domino:view> 标记的 enableselect 参数来实现:

ftsearch="<%=searchstring%>"enableselect="true" >

您还需要在希望显示这个复选框的地方添加一个 <domino:selectentry> 标签。我们将其放到标题之前:

				<domino:selectentry/> <domino:viewitem col="2"/>

现在需要添加实际的代码来处理删除文档的功能了。在 <domino:view> 标签之前,添加这个操作代码(它会在您使用这个操作的视图之前出现):

    <domino:ifserverevent event="OnAction" for="DeleteDocuments">    
    <domino:selectedloop viewname="Books/by Status"     
        dbserver="CN=SlipGate/O=KEY Enterprise Solutions"         
        dbname="AmazonWS.nsf"         
        user="username"         
        password="password"         
        host="SlipGate">
    <% document.remove(true); %>    
    </domino:selectedloop>    
    </domino:ifserverevent>

<domino:selectedloop> 参数应该与您在 <domino:view> 标签中使用的参数匹配。最后,您还需要添加一个调用这个删除操作的链接。您可以通过在 </TABLE> 标签之后添加下面的代码来实现这种功能:

<domino:action name="DeleteDocuments" text="Delete Selected Documents"/>

在添加这段代码之后,Web 页面就会如下所示:


图 9. Delete Selected Documents 链接
Delete Selected Documents 链接

您可以选择删除哪些文档。利用类似的技术,您还可以对文档进行分类。

编辑文档

管理员需要能够对书籍文档中的 Category 和 Notes Version 域进行编辑。要实现这种功能,需要在 editBook.jsp 中修改 <domino:form> 标签来包含 editmode 参数:

schema="Book"editmode="edit" >

还要修改 admin/index.jsp 中的 <domino:formlink> 标签来打开 editBook.jsp 页面:

<domino:formlink href="editBook.jsp">

当点击 admin/index.jsp 页面中的一个链接时,就会看到一个类似于下图的表单:


图 10. 编辑模式中的文档
编辑模式中的文档

如果您曾经看到过 Domino 所提供的等效内容,就可能会注意到这个表单中有很多内容:NotesVer 和 Category 域名不是从 Notes 表单中使用可选元素自动显示的;您需要修改某些域的长度;但是您可能希望让一些主要的域都是只读的。下面让我们首先集中介绍只读的问题。在 editBook.jsp 中对只读域将 <domino:input> 标签修改为 <domino:item>。记住要删除 type="text" 属性,这是由 Lotus Domino Toolkit for WebSphere Studio 自动为 <domino:input> 标签生成的,因为 <domino:item> 标签并不能使用这个属性。

接下来,需要修改 NotesVer、Category 和 State 域的内容,这样,它们就不再是简单文本输入域了,而是一些复选框和单选按钮了。不幸的是,它们并没有从 Domino 表单中读出可能的值。下面是一个转变成复选框的 NotesVer 域的样子(原来的 <domino:input> 标签被注释掉了):

    <!--domino:input name="NotesVer" type="text" /-->    
    <domino:checkbox name="NotesVer" value="3" multivalue="true"/>3    
    <domino:checkbox name="NotesVer" value="4" multivalue="true"/>4    
    <domino:checkbox name="NotesVer" value="4.5" multivalue="true"/>4.5    
    <domino:checkbox name="NotesVer" value="4.6" multivalue="true"/>4.6    
    <domino:checkbox name="NotesVer" value="5" multivalue="true"/>5    
    <domino:checkbox name="NotesVer" value="6" multivalue="true"/>6

下面是使用单选按钮修改 State 域时所需的代码:

    <!--domino:input name="State" type="text" /-->    
    <domino:radio name="State" value="New" />New    
    <domino:radio name="State" value="Added" />Added    
    <domino:radio name="State" value="Not Relevant" />Not Relevant    
    <domino:radio name="State" value="No Longer Published" />No Longer Published

最后,您需要添加一个方法来保存文档,并返回上一个视图。这可以使用 <domino:saveclosedoc> 标签实现。将下面这行代码添加到 </TABLE> 标签之后:

    <domino:saveclosedoc validhref="index.jsp" text="Save Document"/>

如果您预览一下新的页面,就会看到下面的 Web 页面:


图 11. editBook.jsp
editBook.jsp




回页首


会话变量安全性

对于会话变量认证来说,您需要在对用户进行认证时使用的 Web 会话中使用以下变量:

变量 说明
l_user 用户登录名,如果使用容器管理的安全性,就是 *webuser
l_pw 用户用来登录的密码
l_admin 如果用户具有管理员角色,该值就是 1
l_fullname 用户的全名(用户输入它来登录)

首先,您需要创建一个 checkLogin.jsp 文件,它会检查一个用户是否已经登录了。下面是这个 JSP 文件的一部分,admin 目录中的所有需要用户进行登录的页面都需要包含这段代码:

<%
    //     this JSP file needs to be imported by all JSP files so they can    
    // get the username/password properly
    String username = (String) session.getAttribute("l_user");    
    String password = (String) session.getAttribute("l_pw");    
    String isAdmin = (String) session.getAttribute("l_admin");    
    String fullname = (String) session.getAttribute("l_fullname");
    if ((username == null) &&     
    (request.getRemoteUser() != null) &&     
    (request.getRemoteUser().compareToIgnoreCase("Anonymous") != 0)) {    
    // this handles the case of using container-managed security and only works    
    // if your J2EE container supports Domino Multi-User Session Authentication;    
    // we have to save the admin role state and stick it in the session variables    
    // and the username is set to *webuser so the Domino JSP Custom tags know to use    
    // the Domino Single Sign On mode of logging in    
    fullname = request.getRemoteUser();    
    session.setAttribute("l_user", "*webuser");    
    session.setAttribute("l_fullname", fullname);    
    if (request.isUserInRole("Admin")) {    
    session.setAttribute("l_admin", "1");    
    } else {    
    session.setAttribute("l_admin", "0");	    
    }    
    }
    if (username == null) {    
    // if username is blank, we have to send the user back to the login page    
    // this path is not taken if you use container managed login because no    
    // pages are loaded until you're logged in successfully    
    response.sendRedirect("../login.jsp?ar=1");    
    }
%>

在容器管理的安全性情况中还有其他一些代码,这样您就可以共享我们将在后文中讨论的其他一些代码了。剩下的代码将用户名/密码加载到一些变量中,之后可以在 JSP 中引用这些变量。如果在某个会话中没有用户名,那么就可以知道这个用户尚未登录,然后使用一个 ar 参数返回 login.jsp 页面,说明需要进行认证。

在 admin/editBook.jsp 和 admin/index.jsp 页面中,您可以将下面这行代码插入顶端:

<%@include file="../checkLogin.jsp"%>

它会加载这段检查一个用户是否登录的 JSP 代码。如果您使用编码模式,这就称为 Guard Pattern,用来说明每个安全的页面在启动时都要进行检查。

在这些页面中,您需要修改 Domino 定制 JSP 标签来使用变量,而不是使用代码中硬编码的用户名和密码,如下所示:

    user="<%=username%>"    
    password="<%=password%>"

下面是 doLogin.jsp 页面的代码,它混合使用了 Java 和 Domino 定制 JSP 标签:

<% try {
    String username = request.getParameter("username");    
    String password = request.getParameter("password");
%>
    <domino:db host="SlipGate"    
        dbname="AmazonWS.nsf"        
        dbserver="CN=SlipGate/O=KEY Enterprise Solutions"        
        user="<%=username%>"        
        password="<%=password%>">
				
<%	
    // Store the username into session context    
    session.setAttribute("l_fullname", request.getParameter("username"));    
    session.setAttribute("l_user", request.getParameter("username"));    
    session.setAttribute("l_pw", request.getParameter("password"));    
    session.setAttribute("l_admin", "0");
%>
    <domino:ifdbrole name="Admin">    
        <% session.setAttribute("l_admin", "1"); %>
    </domino:ifdbrole>    
        </domino:db>
<% 
    response.sendRedirect("index.jsp");
    } catch (Exception e) {    
    // flush current login info    
    session.setAttribute("l_user", null);    
    session.setAttribute("l_pw", null);    
    session.setAttribute("l_admin", null);    
        // redirect to login page        
        response.sendRedirect("login.jsp?lf=1");
    }
%>

注意这段代码从 Notes 数据库的 ACL 中检索用户的角色信息。这会简化对应用程序的管理,因此您不用在 J2EE 服务器中定义一个单独的用户/角色映射。它会使用一个 lf 参数返回登录页面,说明登录失效了;如果成功,就会打开主视图。

doLogin.jsp 页面是由 login.jsp 调用的,后者非常简单,在某些条件下会在页面顶端显示错误消息:

<form method="POST" action="doLogin.jsp">
    <domutil:if>    
    <domutil:condition>    
        <%= request.getParameter("lf") != null%>
    </domutil:condition>    
    <center><b>Login Failure!</b></center>    
    <p>    
    </domutil:if>
    <domutil:if>    
    <domutil:condition>    
        <%= request.getParameter("ar") != null%>
    </domutil:condition>    
        <center><b>Authorization Required. Please Log In.</b></center>        
        <p>
    </domutil:if>
<TABLE border="0">
    <TBODY>    
    	<TR>    
        <TD>Username:</TD>        
        <TD><input type="text" name="username"></TD>
    </TR>    
    <TR>    
        <TD>Password:</TD>        
        <TD><input type="password" name="password"></TD>
    </TR>    
    </TBODY>
</TABLE>
<input type="submit" value="Log In">
</form>

最后,您还需要编写 logout.jsp 页面。这非常简单,它清空 Web 会话,并从系统中注销:

<%
    // t    his just purges any log information and goes to the index page    
    session.invalidate();    
    response.sendRedirect("index.jsp");
%>

完成 logout.jsp 页面的设计之后,将下面的代码添加到 index.jsp 顶部(不是 admin 子目录中的 index.jsp 文件),这样用户就可以登录、注销并访问管理页面了。您也可以使用 Java 代码来实现这种功能:

<%
    if (session.getAttribute("l_user") != null) {    
    response.getWriter().println("You're logged in as " + session.getAttribute("l_user"));
    String hasAdmin = (String) session.getAttribute("l_admin");    
    if ((hasAdmin != null) &&    
    (hasAdmin.compareTo("1") == 0)) {    
    response.getWriter().println("<BR>You have the Admin role");    
    }
    response.getWriter().println("<BR><a href=\"logout.jsp\">Log Out</a>");    
    } else {    
    response.getWriter().println("<a href=\"login.jsp\">Log In</a>");    
    }    
    response.getWriter().println("<BR><a href=\"admin/index.jsp\">Admin Page</a>");
%>





回页首


容器管理的安全性

如果您有一个可以支持 Lotus Domino 的 Multiserver Single Sign-On(多服务器单点登录)的 J2EE 服务器,例如 JBoss(添加一个第三方插件 Domino/JBoss SSO)或 IBM WebSphere Enterprise(其他版本的 WebSphere 不支持 Domino SSO 的功能),您就可以在应用程序中利用容器管理的安全性。容器使用 Domino(运行了 LDAP)来处理用户的登录,这样就可以在标准的 Domino Directory 中维护用户信息了;角色可以由 J2EE 服务器进行管理,也可以放到 Domino Directory 中,这取决于 J2EE 服务器的实现。

您需要对 web.xml 文件进行一些修改来保护 Web 应用程序的 /admin 目录,这样就只能由具有 Admin 角色的用户进行访问。幸运的是,WebSphere Studio 为您提供了一个很好的 Web 部署描述符编辑器,因此您就不需要太过担心对 web.xml 进行修改所引起的拼写和顺序问题。在 WebSphere Studio 中编辑 WEB-INF/web.xml,可以通过在这个文件上双击来打开 Web Deployment Descriptor Editor 实现。开始时您应该在 Overview 附签中。单击 Security Details 按钮,或者单击该窗口底部的 Security 附签:


图 12. Web Deployment Descriptor - Security 附签
Web Deployment Descriptor - Security 附签

在单击 Security 附签之后,请单击 Security Roles 附签(这个附签位于该页面上 Security 的下面)。在这里可以添加一个名为 Admin 的角色。然后单击 Security Constraints 附签。添加一个 URL 限制(对于 GET、PUT、HEAD、POST、DELETE HTTP 方法)来指定 /admin/* URL 应该只能由具有 Admin 角色的用户进行编辑:


图 13. Web Resources Collection 对话框
Web Resource Collections 对话框

这就是要设置的地方。使用这种类型的安全性的优点是 /admin 目录中的所有内容现在都受到保护了。您不会听到有人发现在 /admin 目录中有不安全的内容以及有人从您的数据库中删除了一些内容的故事了。

对于容器管理的安全性,您还应该将下面的代码添加到 checkLogin.jsp 文件中:

    if ((username == null) &&     
    (request.getRemoteUser() != null) &&     
    (request.getRemoteUser().compareToIgnoreCase("Anonymous") != 0)) {    
    // this handles the case of using container-managed security and only works    
    // if your J2EE container supports Domino Multi-User Session Authentication;    
    // we have to save the admin role state and stick it in the session variables    
    // and the username is set to *webuser so the Domino custom JSP tags know to use    
    // the Domino Single Sign On mode of logging in    
    fullname = request.getRemoteUser();    
        session.setAttribute("l_user", "*webuser");        
        session.setAttribute("l_fullname", fullname);        
        if (request.isUserInRole("Admin")) {        
        session.setAttribute("l_admin", "1");        
        } else {        
        session.setAttribute("l_admin", "0");	        
        }
    }

在具有容器管理的安全性之后,就可以使用标准的 servlet 方法 getRemoteUser() 和 isUserInRole() 来获取用户名并检查某个用户是否具有某种角色了。当用户返回顶级目录时,根据 J2EE 容器对 servlet API 实现的不同,这种方法可能依然工作,也可能就不能再工作了。因为这些代码对 /admin 目录中所有的 JSP 都会执行,所以您可以将这些信息插入会话中,这样就可以在不受限制的 JSP 中使用这些信息了。

如果您希望在 Websphere Studio 的 Websphere Test Environment in Websphere Studio 中对容器管理的安全性进行测试,就必须在 Domino 上运行 LDAP 服务,因为 WebSphere 使用 LDAP 进行登录。在 Server Configuration 中,双击 WebSphere v5.0 Test Environment 打开这个配置。然后在 WebSphere Server Configuration 中,选择 Enable the administration console 选项。接下来启动 WebSphere 服务器。您可以通过登录到 http://localhost:9090/admin/ 打开 Websphere Admin Console,来启用 Global Security 并配置 LDAP:


图 14. WebSphere Global Security 设置
WebSphere Global Security 设置




回页首


部署到 J2EE 服务器

在可以将 AmazonWS.jar 文件部署到 J2EE 服务器上之前,您需要设置一些内容让 Domino 定制 JSP 标签可以正常工作。首先,将 NSCO.jar 文件拷贝到 J2EE 服务器中(这假设您使用 DIIOP 来访问 Domino)。它应该放到所有 Web 应用程序都可以使用的一个目录中;在 WebSphere 中,这个目录是 /appserver/lib/ext。如果您希望指定在一个地方存放所有数据库的 Domino 服务器,而不是在每个 Web 页面中都指定一个服务器,可以将下面的 context-param 加入您的 web.xml 文件中:

    <context-param id="ContextParam_host">    
    <param-name>lotus.domino.default.host</param-name>    
    <param-value>DominoServerName</param-value>    
    </context-param>





回页首


结束语

使用 Lotus Domino Toolkit for WebSphere Studio 的优点有:可以提高 Web 应用程序的性能、开发效率以及安全性。应用程序性能是通过一个纯 Domino 应用程序来提高的,这是因为 Web 应用程序的前端可以与 Domino 服务器分开,后者可以用来处理 Notes 数据库。

通过使用 Notes 客户机来编辑管理性的文档而不是花费大量时间来只为管理创建一些 Web 应用程序,可以快速提高 Web 应用程序的开发效率。Domino 定制 JSP 标签(不是 WebSphere Studio 集成)提供了自动视图分页的功能,并对视图的选择/处理提供了简单的支持。它们还提供了对 Domino 中广泛使用的全文搜索功能的支持,这样就不用花费大量的时间来处理关系数据库的全文索引了。

如果您希望增加一些 Web 应用程序的安全性,Notes 数据库的文档级读/写控制就比关系数据库中提供的安全性要好。作为一个次要级别的安全性,如果您要作为真实的用户而不是匿名用户来访问 Notes 数据库(我们在后端使用关系数据库的 Web 应用程序中经常都是这样使用的),就可以使用 Notes 数据库的 ACL。

Domino 定制 JSP 标签为这样一些公司提供了一种很好的选择,这些公司具有一个希望使用 J2EE 应用服务器来提供对 Notes/Domino 数据的访问的 Notes/Domino 基础设施。IBM/Lotus 已经多次说明 Domino/WebSphere 集成将会更加紧密地将这些标签集成到 WebSphere Studio 中。Lotus Domino Toolkit for WebSphere Studio 还只是这个旅程中的第一步而已。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章