﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-狂奔 lion-随笔分类-HLD</title><link>http://www.blogjava.net/yangyi/category/28799.html</link><description>自强不息</description><language>zh-cn</language><lastBuildDate>Sat, 26 Jun 2010 02:52:19 GMT</lastBuildDate><pubDate>Sat, 26 Jun 2010 02:52:19 GMT</pubDate><ttl>60</ttl><item><title>Spring Security 2 中动态角色权限的实现</title><link>http://www.blogjava.net/yangyi/archive/2009/03/04/257764.html</link><dc:creator>杨一</dc:creator><author>杨一</author><pubDate>Wed, 04 Mar 2009 04:55:00 GMT</pubDate><guid>http://www.blogjava.net/yangyi/archive/2009/03/04/257764.html</guid><wfw:comment>http://www.blogjava.net/yangyi/comments/257764.html</wfw:comment><comments>http://www.blogjava.net/yangyi/archive/2009/03/04/257764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyi/comments/commentRss/257764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyi/services/trackbacks/257764.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-indent: 21pt"><span style="font-family: 宋体">安全框架的主体包括两部分即验权和授权。</span>Spring Security2<span style="font-family: 宋体">可以很好的实现这两个过程。</span>Spring Security2<span style="font-family: 宋体">对其前身</span>acegi<span style="font-family: 宋体">最大的改进是提供了自定义的配置标签，通过</span>Security<span style="font-family: 宋体">的命名空间定义了</span>http<span style="font-family: 宋体">和</span>authentication-provider<span style="font-family: 宋体">等标签，这样做的好处是极大地简化了框架的配置，并很好地隐藏了框架实现的细节，在配置的表述上也更清晰，总体上提高了框架的易用性。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">然而，该框架默认的权限配置方式在</span>xml<span style="font-family: 宋体">中，又因为新版本隐藏了实现细节，在动态权限的扩展上，能力变小了。在验权过程中，遇到的问题不多。但在授权时，如果是</span>acegi<span style="font-family: 宋体">，人们可以通过继承</span>AbstractFilterInvocationDefinitionSource<span style="font-family: 宋体">类实现在授权（即资源角色和用户角色的匹配）前，针对资源的角色的获取。而新版本因为用新标签进行了整合，这个过程被默认的类实现隐藏掉了，包括过滤器，资源获取和角色定义等过程都由框架来实现，于是很多人在使用</span>Spring Security2<span style="font-family: 宋体">时也想通过改动</span>DefaultFilterInvocationDefinitionSource<span style="font-family: 宋体">对资源的获取来实现数据库或文件中的动态的角色。不过这样的改动侵入性比较高，而且还保留了</span>acegi<span style="font-family: 宋体">的痕迹，也违背了开闭的原则。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">其实，我们完全可以通过</span>Spring Security2 accessManager<span style="font-family: 宋体">提供的自定义投票机制来解决这个问题，这样既不影响现有的基于</span>URL<span style="font-family: 宋体">的配置，还可以加入自己的动态的权限配置。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">其实现策略如下：</span></p>
<p style="text-indent: 21pt">1 <span style="font-family: 宋体">定义类</span>DynamicRoleVoter<span style="font-family: 宋体">实现</span>AccessDecisionVoter<span style="font-family: 宋体">，注入实现接口</span>DynamicRoleProvider<span style="font-family: 宋体">（用来定义获取角色的方法）的提供动态角色的类</span></p>
<p style="text-indent: 21pt">2 <span style="font-family: 宋体">在两个</span>supports<span style="font-family: 宋体">方法中返回</span>true</p>
<p style="text-indent: 21pt">3 <span style="font-family: 宋体">在</span>vote<span style="font-family: 宋体">方法中，有三个参数</span>(Authentication authentication, Object object,</p>
<p style="text-indent: 21pt">ConfigAttributeDefinition config) <span style="font-family: 宋体">通过第一个获取用户的权限集合，第二个可以获取到资源对象，进而通过</span>DynamicRoleProvider<span style="font-family: 宋体">获取到角色集合进行匹配。</span></p>
<p style="text-indent: 21pt">4 <span style="font-family: 宋体">在配置文件中加入</span>DynamicRoleVoter<span style="font-family: 宋体">，如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="accessDecisionManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.security.vote.AffirmativeBased"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="decisionVoters"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.security.vote.RoleVoter"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="org.springframework.security.vote.AuthenticatedVoter"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:bean&nbsp;</span><span style="color: #ff0000">class</span><span style="color: #0000ff">="DynamicRoleVoter"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dynamicRoleProvider"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="dynamicRoleProvider"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans:property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans:bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans:list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans:property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans:bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans:bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">=&#8221;&nbsp;</span><span style="color: #ff0000">dynamicRoleProvider&#8221;&nbsp;class</span><span style="color: #0000ff">=&#8221;&#8230;&#8221;&gt;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">&#8230;&#8230;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&lt;/beans:bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
</span>
<img src ="http://www.blogjava.net/yangyi/aggbug/257764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyi/" target="_blank">杨一</a> 2009-03-04 12:55 <a href="http://www.blogjava.net/yangyi/archive/2009/03/04/257764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>系统模型及系统故障日志的思考</title><link>http://www.blogjava.net/yangyi/archive/2008/01/07/173344.html</link><dc:creator>杨一</dc:creator><author>杨一</author><pubDate>Mon, 07 Jan 2008 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/yangyi/archive/2008/01/07/173344.html</guid><wfw:comment>http://www.blogjava.net/yangyi/comments/173344.html</wfw:comment><comments>http://www.blogjava.net/yangyi/archive/2008/01/07/173344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyi/comments/commentRss/173344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyi/services/trackbacks/173344.html</trackback:ping><description><![CDATA[最近在研究关于系统的基于日志的故障恢复，无意间在网上发现一篇论文中对于系统日志模型的精彩论述，翻译过来并附上我的思路：<br />
『<br />
<font color="#0000ff">一个系统是一个具有明显的边界的实体，它根据一定的输入，自身运行逻辑及系统的内部时钟变化来产生相应的输出。<br />
所谓&#8220;明显的边界&#8221;是指系统所产生的输出是明确而无二义性的。我们称这个边界为系统的设计规范（specification）。一个系统通过与其所处环境进行交互，从而获取输入并产生输出。一个系统可以被拆解为不同的子系统。这些子系统通常被称为系统模块（system components），每个模块又独立地成为一个系统，作为一个系统，这个模块又会和它的相关环境进行交互（比如，一个更大的系统中的其他的模块组件）来获取输入并产生输出，这些模块还可以继续被分解为更小的子系统。<br />
一个系统可以被建模为一个状态机（state machine），其中的状态包含了系统所持有并处理的数据。这些状态的迁移被分为两大类：由系统内部逻辑所触发且对外部环境透明的迁移和直接与外部环境相接触的迁移。前者的例子如内存数据和寄存器数据的转换，内存中数据结构的重组。第二种迁移的例子包含了各种各样的系统和环境之间的交互，一般来说，如果这个过程能被建模成系统的I/O操作，则应属于这一类别。因此，一个消息内容的形成是一个或多个第一类别状态迁移的结果，但将消息输出到系统的环境则是属于第二类迁移。<br />
第二类别的状态迁移可以捕获交互事件（interaction events），或者简单的事件（events）。这些事件可以由系统外部的观察者（observer）来获取。显然，这里的事件是消息、信号、数据及其内容以及一切系统和其环境交互（如机器人运动手脚，报警器报警，打印机打印等等）的发送和接受的模型。此外事件还可以用来描述系统缺乏交互的时间，比如一个计时器在日志中输出系统的空闲时间等。<br />
当一个大的系统被拆分成多个模块时，每个模块都被赋予了整个系统所处理数据的一部分，正因为模块和模块间的接口衔接和数据感知，一些原来属于第一类别的状态转换，因为系统的拆分在更低的层次上变成了第二类别，成为系统和环境之间的交互。<br />
对于一个特定的系统，他对于输入的形式和获取时间是不可预知的，但是这个系统却应该能够做到根据一个特定的输入以及系统当前的特定状态获取一个特定的输出。因此系统的执行可以被建模为状态转换序列，每个状态的输入是一个不确定性事件。为了记录日志并做到故障恢复，我们还应做到能够在环境中捕获这个不确定性事件输入。<br />
此外，在系统与系统间进行交互式，事件的传递时间也应该是不确定性的。</font><br />
』<br />
<br />
怎样用日志来预防系统崩溃，在崩溃后如何还原系统，我想关键问题就是怎么做好内存的快照，这样，在断电重启后可以通过日志来还原内存的信息这样第一步就是确认内存中的数据结构，哪些是必不可少的。确定系统恢复的粒度，按照子系统的分割和事件的记录来进行replay，根据子系统的划分，可以找出每个子系统中第二类别的事件进行记录。<br />
以向数据库系统提交作业为例，实际上在整个作业提交的过程中，每个层次都要做到可以在失败的情况下重现，这个功能在完善的数据库系统和集群批处理系统中当然已经很完善。但如果是针对web系统的作业提交，则需要针对Web的作业持久方案，做一个日志恢复处理。需要特别指出的是，对于数据的查询是不需要做备份的。<br />
在具体实现上，我想应该包括：日志记录，故障检测，日志持久三个部分。一份日志就是一个对于系统检查点（checkpoint）的连续记录。日志记录者负责记录日志到日志持久者，故障检测器随时监控系统，发现故障后，从日志持久者中读取日志，进行replay. 
<img src ="http://www.blogjava.net/yangyi/aggbug/173344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyi/" target="_blank">杨一</a> 2008-01-07 14:44 <a href="http://www.blogjava.net/yangyi/archive/2008/01/07/173344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何实现包含插件功能的Applet Web界面</title><link>http://www.blogjava.net/yangyi/archive/2008/01/02/172204.html</link><dc:creator>杨一</dc:creator><author>杨一</author><pubDate>Wed, 02 Jan 2008 07:07:00 GMT</pubDate><guid>http://www.blogjava.net/yangyi/archive/2008/01/02/172204.html</guid><wfw:comment>http://www.blogjava.net/yangyi/comments/172204.html</wfw:comment><comments>http://www.blogjava.net/yangyi/archive/2008/01/02/172204.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyi/comments/commentRss/172204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyi/services/trackbacks/172204.html</trackback:ping><description><![CDATA[<p>不知诸位有没有想过用Applet来组织Web的程序界面？小弟最近整理了一些杂碎的思路，思想完全开放，欢迎批评。<br />
先说一下可能遇到的问题：<br />
1 安全性：Applet对本地资源的操作需要相应的安全许可；<br />
2 库资源的下载：如何下载及管理支持本地Applet的库资源；<br />
3 通信：Applet如何与后台的Servlet进行通信；<br />
4 图形的加载：如何利用Applet动态的实例化并展现界面。</p>
<p>下面一一展开讨论</p>
<p>（一）保障安全性</p>
<p>安全性的主要解决方案是利用Java提供的keytool生成一个keystore，并利用这个keystore对jar包进行signjar的操作。<br />
整个对Java文件的编译，打包和signjar过程可以利用Ant来完成，比如下面的Ant脚本片段就是用来处理signjar的，大家也可以通过相应的Java命令直接处理：</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />
<span style="color: rgb(0, 0, 255);">&lt;</span>
<span style="color: rgb(128, 0, 0);">target&nbsp;</span>
<span style="color: rgb(255, 0, 0);">name</span>
<span style="color: rgb(0, 0, 255);">="signjar"</span>
<span style="color: rgb(255, 0, 0);">&nbsp;depends</span>
<span style="color: rgb(0, 0, 255);">="jar"</span>
<span style="color: rgb(0, 0, 255);">&gt;</span>
<span style="color: rgb(0, 0, 0);">
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span>
<span style="color: rgb(0, 0, 255);">&lt;</span>
<span style="color: rgb(128, 0, 0);">signjar&nbsp;</span>
<span style="color: rgb(255, 0, 0);">jar</span>
<span style="color: rgb(0, 0, 255);">="example.jar"</span>
<span style="color: rgb(255, 0, 0);">
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;keystore</span>
<span style="color: rgb(0, 0, 255);">="${basedir}/yangyi.keystore"</span>
<span style="color: rgb(255, 0, 0);">&nbsp;storepass</span>
<span style="color: rgb(0, 0, 255);">="mypassword"</span>
<span style="color: rgb(255, 0, 0);">&nbsp;alias</span>
<span style="color: rgb(0, 0, 255);">="mykey"</span>
<span style="color: rgb(0, 0, 255);">&gt;&lt;/</span>
<span style="color: rgb(128, 0, 0);">signjar</span>
<span style="color: rgb(0, 0, 255);">&gt;</span>
<span style="color: rgb(0, 0, 0);">
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />
</span>
<span style="color: rgb(0, 0, 255);">&lt;/</span>
<span style="color: rgb(128, 0, 0);">target</span>
<span style="color: rgb(0, 0, 255);">&gt;</span>
</div>
<p>如果直接用命令，则其形式为：<br />
jarsigner [ options ] jar-file alias<br />
具体的操作方法可以参考下面的链接：<br />
<a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/jarsigner.html">http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/jarsigner.html</a><br />
通过这个signjar的操作，我们就给这个包中的类进行了一次数字签名，这样，当Applet进行默认许可之外的操作时，窗口将弹出这个数字签名要求本地用户进行确认，只有在确认后，用户才可以继续进行操作。</p>
<p>这样我们可以在第一次用户运行Applet程序时，在用户的许可下动态地在用户的$user.home/.java.policy下生成一个授权文件，以后就可以执行需要的操作了，为保证客户端的安全性，仅赋予用户执行特定文件夹权限的权利，如（仅作为例子,可以根据需要自己配置文件和Socket访问权限）：<br />
grant codeBase "file:/home/yiyang/test/&#215;" {<br />
&nbsp;java.security.AllPermission;<br />
};</p>
<p>（二）下载并管理库支持</p>
<p>这个过程可以通过Java的URL类提供的openConnection方法来获取一个InputStream从而获取到远程的资源（包括支持库和配置文件两部分）<br />
1）对于配置文件，因为其内容都比较少，而且比较简单，可以直接通过输入流来获取，这是没有异议的；<br />
2）对于库文件，在下载之前先到我们管理的库的目录下找到版本索引文件（我们设定一个版本索引文件来管理升级），这个版本索引文件如下所示：</p>
<p>time={资源获取的时间戳}<br />
lib1.jar=1.0<br />
lib2.jar=1.1</p>
<p>其中，服务器端也保留有一份这样的版本文件，当下载库文件时，首先对客户端和服务端的库的总时间戳进行比较，如果客户端大于或等于服务端，则不需下载，否则，如果客户端对应项目为空或者其总的时间戳小于服务端，则进一步比较内部库文件的版本，发现版本低的库或在客户端不存在的库后，自动到服务器上进行下载，在下载成功后，更新客户端的索引文件。</p>
<p>（三）通信</p>
<p>这个问题小弟曾在以往的blog中有过详细的讨论，可以到<a href="http://yangyi.blogjava.net">http://yangyi.blogjava.net</a>中的相应随笔中找到答案。总的来说，在类型协议并不复杂，且客户端，服务端均为Java开发的情况下，应用Hessian是一个好的解决方案，需要指出的是Hessian中的代码对客户端来说并不是全部必须的，大家可以根据客户端的使用情况对这个库进行瘦身。只保留作为客户端必要的类即可。</p>
<p>（四）动态的实例化及插件结构</p>
<p>我们要实现用户界面的集成，从根本上说要解决下面的几个问题：<br />
1）菜单集成<br />
2）支持库集成<br />
3）集成点<br />
4）输出变量<br />
对于客户端为Applet开发的插件，我们把上面的四项配置统一在XML文件中进行描述定义。<br />
这里需要注意的是菜单要提供名称，支持库要提供下载路径或者本地路径，集成点我们希望是一个JPanel。<br />
在定义好XML后，可以到网址：<a href="http://www.flame-ware.com/xml2xsd/">http://www.flame-ware.com/xml2xsd/</a>去获得一个对应的schema，利用这个schema和JAXB提供的xjc工具，我们就可以生成对应的XML操作类，来对配置进行处理。<br />
对于菜单的集成可以动态地在JMenu中添加MenuItem（表示插件的功能）<br />
根据配置的支持库的位置，我们可以通过Java的URLClassLoader对库进行动态的加载，然后根据相应的集成点，获取实例，这个过程的示例代码如下所示：<br />
</p>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />
<span style="color: rgb(0, 0, 0);">File&nbsp;f&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;</span>
<span style="color: rgb(0, 0, 255);">new</span>
<span style="color: rgb(0, 0, 0);">&nbsp;File(</span>
<span style="color: rgb(0, 0, 0);">"</span>
<span style="color: rgb(0, 0, 0);">a.jar</span>
<span style="color: rgb(0, 0, 0);">"</span>
<span style="color: rgb(0, 0, 0);">);&nbsp;</span>
<span style="color: rgb(0, 128, 0);">//</span>
<span style="color: rgb(0, 128, 0);">a.jar是我们从配置文件中读取的支持库</span>
<span style="color: rgb(0, 128, 0);">
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />
</span>
<span style="color: rgb(0, 0, 0);">URL&nbsp;url&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;</span>
<span style="color: rgb(0, 0, 255);">null</span>
<span style="color: rgb(0, 0, 0);">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Class&nbsp;lib&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;</span>
<span style="color: rgb(0, 0, 255);">null</span>
<span style="color: rgb(0, 0, 0);">;<br />
<img id="Codehighlighter1_89_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_89_288_Open_Text.style.display='none'; Codehighlighter1_89_288_Closed_Image.style.display='inline'; Codehighlighter1_89_288_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_89_288_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_89_288_Closed_Text.style.display='none'; Codehighlighter1_89_288_Open_Image.style.display='inline'; Codehighlighter1_89_288_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span>
<span style="color: rgb(0, 0, 255);">try</span>
<span style="color: rgb(0, 0, 0);">&nbsp;</span>
<span id="Codehighlighter1_89_288_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
<img src="http://www.blogjava.net/images/dot.gif"  alt="" />
</span>
<span id="Codehighlighter1_89_288_Open_Text">
<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;url&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;f.toURI().toURL();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;lib&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;Class.forName(</span>
<span style="color: rgb(0, 0, 0);">"</span>
<span style="color: rgb(0, 0, 0);">Lib</span>
<span style="color: rgb(0, 0, 0);">"</span>
<span style="color: rgb(0, 0, 0);">,&nbsp;</span>
<span style="color: rgb(0, 0, 255);">true</span>
<span style="color: rgb(0, 0, 0);">,&nbsp;</span>
<span style="color: rgb(0, 0, 255);">new</span>
<span style="color: rgb(0, 0, 0);">&nbsp;URLClassLoader(<br />
<img id="Codehighlighter1_184_190_Open_Image" onclick="this.style.display='none'; Codehighlighter1_184_190_Open_Text.style.display='none'; Codehighlighter1_184_190_Closed_Image.style.display='inline'; Codehighlighter1_184_190_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_184_190_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_184_190_Closed_Text.style.display='none'; Codehighlighter1_184_190_Open_Image.style.display='inline'; Codehighlighter1_184_190_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span>
<span style="color: rgb(0, 0, 255);">new</span>
<span style="color: rgb(0, 0, 0);">&nbsp;URL[]&nbsp;</span>
<span id="Codehighlighter1_184_190_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
<img src="http://www.blogjava.net/images/dot.gif"  alt="" />
</span>
<span id="Codehighlighter1_184_190_Open_Text">
<span style="color: rgb(0, 0, 0);">{&nbsp;url&nbsp;}</span>
</span>
<span style="color: rgb(0, 0, 0);">));&nbsp;</span>
<span style="color: rgb(0, 128, 0);">//</span>
<span style="color: rgb(0, 128, 0);">Lib是我们从配置文件中读取的集成点</span>
<span style="color: rgb(0, 128, 0);">
<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />
</span>
<span style="color: rgb(0, 0, 0);">&nbsp;JPanel&nbsp;plugin_panel&nbsp;</span>
<span style="color: rgb(0, 0, 0);">=</span>
<span style="color: rgb(0, 0, 0);">&nbsp;(JPanel)lib.newInstance();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span>
<span style="color: rgb(0, 0, 255);">return</span>
<span style="color: rgb(0, 0, 0);">&nbsp;plugin_panel;<br />
<img id="Codehighlighter1_310_334_Open_Image" onclick="this.style.display='none'; Codehighlighter1_310_334_Open_Text.style.display='none'; Codehighlighter1_310_334_Closed_Image.style.display='inline'; Codehighlighter1_310_334_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_310_334_Closed_Image" style="display: none;" onclick="this.style.display='none'; Codehighlighter1_310_334_Closed_Text.style.display='none'; Codehighlighter1_310_334_Open_Image.style.display='inline'; Codehighlighter1_310_334_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />}</span>
</span>
<span style="color: rgb(0, 0, 0);">&nbsp;</span>
<span style="color: rgb(0, 0, 255);">catch</span>
<span style="color: rgb(0, 0, 0);">&nbsp;(Exception&nbsp;e)&nbsp;</span>
<span id="Codehighlighter1_310_334_Closed_Text" style="border: 1px solid rgb(128, 128, 128); display: none; background-color: rgb(255, 255, 255);">
<img src="http://www.blogjava.net/images/dot.gif"  alt="" />
</span>
<span id="Codehighlighter1_310_334_Open_Text">
<span style="color: rgb(0, 0, 0);">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span>
</span>
</div>
<p>对于输出变量，其主要作用是用户各个插件之间的信息交互，我们可以通过一个总的HashMap来实现，为避免变量值出现冲突，在变量名前自动加上插件名的前缀。<br />
如plug_in1的变量var1，其系统名称为：plug_in1__var1.</p>
<p>解决了上面的四个障碍，我们就可以把精力投入到具体的功能实现上了。</p>
<img src ="http://www.blogjava.net/yangyi/aggbug/172204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyi/" target="_blank">杨一</a> 2008-01-02 15:07 <a href="http://www.blogjava.net/yangyi/archive/2008/01/02/172204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAAS及JNI实现在Java环境下的Unix/Linux权限认证</title><link>http://www.blogjava.net/yangyi/archive/2007/12/12/167266.html</link><dc:creator>杨一</dc:creator><author>杨一</author><pubDate>Wed, 12 Dec 2007 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/yangyi/archive/2007/12/12/167266.html</guid><wfw:comment>http://www.blogjava.net/yangyi/comments/167266.html</wfw:comment><comments>http://www.blogjava.net/yangyi/archive/2007/12/12/167266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yangyi/comments/commentRss/167266.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yangyi/services/trackbacks/167266.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇随笔谈一谈如何在Java环境下利用Unix/Linux的用户名和密码对用户的权限作出过滤。为方便大家学习交流，本文中给出了源代码，借此抛砖引玉，欢迎大家对这个简单的登录模型做出改进或者设计出自己的技术方案。<br>由标题我们不难看出，与本文相关的知识点主要有3个：<br>1 JAAS这个解耦设计的多层验证方法（1.4后已归入Java核心库中）<br>2 应用JNI访问底层代码，及JNI中简单的类型匹配<br>3 在shadow模式下，Unix/Linux系统的用户验证&nbsp;&nbsp;<a href='http://www.blogjava.net/yangyi/archive/2007/12/12/167266.html'>阅读全文</a><img src ="http://www.blogjava.net/yangyi/aggbug/167266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yangyi/" target="_blank">杨一</a> 2007-12-12 16:50 <a href="http://www.blogjava.net/yangyi/archive/2007/12/12/167266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>