<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>grandboy</title>
    <description></description>
    <link>http://grandboy.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Tomcat远程调试设置</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/232209" style="color:red;">http://grandboy.javaeye.com/blog/232209</a>&nbsp;
          发表时间: 2008年08月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在tomcat/bin/的catalina.bat文件中加入下面的设置，当然SET CATALINA_OPTS 变量应该在使用它之前。这是在tomcat启动时设置一些虚拟机参数，使服务器允许远程连接功能，address=5888表示远程连接的端口号，可以设置成任意其他不冲突端口。其他的应用服务器比如weblogic也应该可以设置这些参数，有兴趣的可以测试。<br /><pre name="code" class="java">
    SET CATALINA_OPTS=-server -Xdebug -Xnoagent 
-Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,
server=y,suspend=n,address=5888 </pre><br /><br /><br />   这样就Ok了，重启动tomcat,可以直接独立启动，而不用在eclipes的插件中启动。打开eclipse中的debug设置窗口，选择Remote Java Application ，新建一个debug项，输入服务器IP和刚才设置端口号，点ok就可以进入debug状态了。<br />不过要注意在Linux下，有一点点差异，是要编辑catalina.sh文件。<br /><br /><br />   而且要改成这样：<br /><pre name="code" class="java">
     CATALINA_OPTS="-server -Xdebug -Xnoagent 
-Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,
server=y,suspend=n,address=5888"</pre><br /><br /><br />   也就是把SET去掉，后面加双引号引起来，因为在Linux下，是没有SET这个语法的。
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/232209#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Aug 2008 09:30:28 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/232209</link>
        <guid>http://grandboy.javaeye.com/blog/232209</guid>
      </item>
      <item>
        <title>SSL-用Keytool和OpenSSL生成和签发数字证书</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/179410" style="color:red;">http://grandboy.javaeye.com/blog/179410</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自: http://zhouzhk.javaeye.com/blog/136943<br /><strong>生成server端证书</strong><br />1)生成KeyPair生成密钥对<br /> keytool -genkey -alias tomcat_server -validity 365 -keyalg RSA -keysize 1024 -keypass 123456  -storepass 123456 -keystore server_keystore<br />输入common name时，要和服务器的域名保持一致。<br />2)生成证书签名请求<br />keytool -certreq -alias tomcat_server -sigalg MD5withRSA -file tomcat_server.csr -keypass 123456 -storepass 123456 -keystore server_keystore <br />3)用CA私钥进行签名，也可以到权威机构申请CA签名。<br />   openssl ca -in tomcat_server.csr -out tomcat_server.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf<br />  其中-notext表示不要把证书文件的明文内容输出到文件中去，否则在后面用keytool导入到keystore时会出错。<br />4)导入信任的CA根证书到keystore<br />   keytool -import -v -trustcacerts  -alias my_ca_root -file ca.crt -storepass 123456 -keystore server_keystore<br />5)把CA签名后的server端证书导入keystore<br />keytool -import -v -alias tomcat_server -file tomcat_server.crt -storepass 123456 -keystore server_keystore<br />6)查看server端证书<br />   keytool -list -v -keystore server_keystore  <br /> 可以看到tomcat_server的证书链长度是2<br /> <br /><strong>生成client端证书</strong><br />1)生成客户端CSR<br />   openssl genrsa -des3 -out tomcat_client.key 1024<br />openssl req -new -key tomcat_client.key -out tomcat_client.csr -config openssl.cnf<br />2)用CA私钥进行签名，也可以到权威机构申请CA签名<br />openssl ca -in tomcat_client.csr -out tomcat_client.crt -cert ca.crt -keyfile ca.key -notext -config openssl.cnf<br />3)生成PKCS12格式证书<br />openssl pkcs12 -export -inkey tomcat_client.key -in tomcat_client.crt -out  tomcat_client.p12<br />4)使用Keytool列出pkcs12证书的内容：<br />   keytool -rfc -list -keystore tomcat_client.p12 -storetype pkcs12
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/179410#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 21:39:07 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/179410</link>
        <guid>http://grandboy.javaeye.com/blog/179410</guid>
      </item>
      <item>
        <title>[引用] java文件路径</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/139703" style="color:red;">http://grandboy.javaeye.com/blog/139703</a>&nbsp;
          发表时间: 2007年11月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><a href="http://blog.csdn.net/laxsong/archive/2006/06/20/816598.aspx">http://blog.csdn.net/laxsong/archive/2006/06/20/816598.aspx</a></font></p>
<p><strong>[引自原文]</strong></p>
<p>FileStream file = this.getClass().getClassLoader().getResourceAsStream(String xmlPath);<br />
这个有点复杂，我了解的也不多，这里就说说现在我所了解的吧，以后再补充！<br />
System.out.println(this.getClass().getClassLoader().getResource(&quot;/&quot;).getPath());<br />
如此就可以看到相对&ldquo;/&rdquo;的根路径。<br />
对&nbsp;&nbsp; FileStream fileStream = this.getClass().getClassLoader().getResourceAsStream(filePath);<br />
这里的filePath似乎只能用相对路径，至少我不知道用绝对路径怎么表示：<br />
下面取个相对路径的例子：<br />
&nbsp;&nbsp;&nbsp; String filePath = &quot;/../../Resources/XML/navigation.xml&quot;; //表达规则和LINUX一样。<br />
<br />
System.out.println(this.getClass().getClassLoader().getResource(&quot;.&quot;).getPath());<br />
System.out.println(this.getClass().getClassLoader().getResource(&quot;/&quot;).getPath());<br />
System.out.println(this.getClass().getClassLoader().getResource(&quot;&quot;).getPath());<br />
System.out.println(this.getClass().getClassLoader().getResource(&quot;..&quot;).getPath());<br />
相信，看过这四个路径结果就应该知道在哪放置自己的文件了，用什么样的语句能找到。<br />
</p>
<p><strong>[补充]</strong></p>
<p>直接取文件流: &nbsp; <br />
&nbsp; InputStream &nbsp; is &nbsp; = &nbsp; this.getClass().getClassLoader().getResourceAsStream(&quot;test/data.txt&quot;); &nbsp; <br />
&nbsp; &nbsp; 或&nbsp;&nbsp;&nbsp;<br />
&nbsp; InputStream &nbsp; is &nbsp; = &nbsp; is.getClass().getResourceAsStream(&quot;test/data.txt&quot;);</p>
<p><strong>[String 与 InputStream相互转换]</strong></p>
<p>BufferedReader &nbsp; bf &nbsp; = &nbsp; new &nbsp; BufferedReader(new &nbsp; InputStreamReader(in));&nbsp;&nbsp;&nbsp; <br />
String &nbsp; s &nbsp; = &nbsp; null;&nbsp;&nbsp;&nbsp;<br />
while &nbsp; ((s=bf.readLine()) &nbsp; != &nbsp; null) &nbsp; &nbsp; System.out.println(s);</p>
<p>InputStream &nbsp; in &nbsp; = &nbsp; new &nbsp; ByteArrayInputStream(&quot;Hello &nbsp; Java &nbsp; World!&quot;.getBytes());</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/139703#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Nov 2007 22:18:27 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/139703</link>
        <guid>http://grandboy.javaeye.com/blog/139703</guid>
      </item>
      <item>
        <title>Jboss4.x下第一个EJB2.x程序 </title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/73331" style="color:red;">http://grandboy.javaeye.com/blog/73331</a>&nbsp;
          发表时间: 2007年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.teachblog.net/powerwind/articles/Jboss4_and_ejb2.html" class="singleposttitle" id="viewpost1_TitleUrl">Jboss4.x下第一个EJB2.x程序</a> </p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/73331#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Apr 2007 11:25:29 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/73331</link>
        <guid>http://grandboy.javaeye.com/blog/73331</guid>
      </item>
      <item>
        <title>开发 WebLogic Server 的安全提供程序的目录 </title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/72179" style="color:red;">http://grandboy.javaeye.com/blog/72179</a>&nbsp;
          发表时间: 2007年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><a href="http://edocs.bea.com.cn/wls/docs92/dvspisec/dvspisecTOC.html">http://edocs.bea.com.cn/wls/docs92/dvspisec/dvspisecTOC.html</a></font></p>
<h1 class="FloatTOCIX"><font size="4">开发 WebLogic Server 的安全提供程序的目录 </font></h1>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/72179#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Apr 2007 13:14:50 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/72179</link>
        <guid>http://grandboy.javaeye.com/blog/72179</guid>
      </item>
      <item>
        <title>Tomcat web程序安全机制 (转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/70252" style="color:red;">http://grandboy.javaeye.com/blog/70252</a>&nbsp;
          发表时间: 2007年04月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>在tomat web服务器中，可以有两种主要的方式来对用户，角色，以及领域进行定义。一种使用简单的xml用户定义的内存realm的验证方式，另外一种是建立数据库连接的jdbc realm验证方式。这两种安全机制定制用户信息来源。</div>
<div>&nbsp;</div>
<div><strong>一，内存（memoryrealm)验证方式：</strong></div>
<div>web程序的拥护，角色，分组在tomcat的/conf/tomat-users.xml文件中定义。这个xml文件列出web服务器允许的用户名称，密码以及对应的分组等。</div>
<div>例如：</div>
<div>&nbsp;</div>
<table cellspacing="0" border="1" bordercolor="#999999" bgcolor="#f1f1f1" width="95%" cellpadding="0" style="BORDER-COLLAPSE: collapse">
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">?</span>xml <span style="COLOR: #ff0000">version</span><span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">'1.0'</span> <span style="COLOR: #ff0000">encoding</span><span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">'utf-8'</span><span style="COLOR: #ff00ff">?</span><span style="COLOR: #0000cc">&gt;</span><br />
            <span style="COLOR: #0000cc">&lt;</span>tomcat-users<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>role rolename<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>role rolename<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;role1&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>user username<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;both&quot;</span> password<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span> roles<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat,role1&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>user username<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span> password<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span> roles<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>user username<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;role1&quot;</span> password<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;tomcat&quot;</span> roles<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;role1&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            <span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>tomcat-users<span style="COLOR: #0000cc">&gt;</span></span></code></p>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><br />
            &nbsp;</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>这里就定义了两个角色，三个用户以及对应的密码。</p>
<p>要使以上的配置文件作用于定义域，就要在server.xml把这个文件定义成为一个数据资源。其目的就是高速web服务器能够在这个文件中找到相关的用户信息。这个定义在tomcat是默认定义的。定义在&lt;GlobalNamingResources&gt;元素中：</p>
<table cellspacing="0" border="1" bordercolor="#999999" bgcolor="#f1f1f1" width="95%" cellpadding="0" style="BORDER-COLLAPSE: collapse">
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><span style="COLOR: #0000cc">&lt;</span>!-- Global JNDI resources --<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>GlobalNamingResources<span style="COLOR: #0000cc">&gt;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>!-- Test entry for demonstration purposes --<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>Environment name<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;simpleValue&quot;</span> type<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;java.lang.Integer&quot;</span> value<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;30&quot;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>!-- Editable user database that can also be used by<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserDatabaseRealm to authenticate users --<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>Resource name<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;UserDatabase&quot;</span> auth<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;Container&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;org.apache.catalina.UserDatabase&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;User database that can be updated and saved&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;org.apache.catalina.users.MemoryUserDatabaseFactory&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pathname<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;conf/tomcat-users.xml&quot;</span> <span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            <br />
            &nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>GlobalNamingResources<span style="COLOR: #0000cc">&gt;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>可以看到pathname<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;conf/tomcat-users.xml&quot;调用上面的那个配置好的文件。虽然这种方式比较简单，但存在着一定问题，比如手动输入，一旦数据多了就很麻烦等。而且保密效果不是很好，xml各式的文件谁都可以打开直接看到。</span></p>
<p><span style="COLOR: #ff00ff"><strong>二，JDBC　realm</strong></span></p>
<p><span style="COLOR: #ff00ff">首先也是在server.xml文件中&lt;Realm&gt;元素中配置一个使用mysql数据库的realm</span>&nbsp;</p>
<table cellspacing="0" border="1" bordercolor="#999999" bgcolor="#f1f1f1" width="95%" cellpadding="0" style="BORDER-COLLAPSE: collapse">
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000">在TOMCAT的server<span style="COLOR: #0000cc">.</span>xml中配置JDBC域验证<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>Realm className<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;org.apache.catalina.realm.JDBCRealm&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driverName<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;com.mysql.jdbc.Driver&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionURL<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;jdbc:mysql://localhost:3306/mydb&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionName<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;root&quot;</span> connectionPassword<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;novell&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userTable<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;users&quot;</span> userNameCol<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;user_name&quot;</span> userCredCol<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;user_pass&quot;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userRoleTable<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;user_roles&quot;</span> roleNameCol<span style="COLOR: #0000cc">=</span><span style="COLOR: #ff00ff">&quot;role_name&quot;</span> <span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">&gt;</span><br />
            <span style="COLOR: #0000cc">&lt;</span>!--当然别望了在Mysql中建立相应的数据表和字段 --<span style="COLOR: #0000cc">&gt;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>当中的系数名字不解释了．．．</p>
<p>对应的表格</p>
<p>create table users(user_name varchar(15) null primary key,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; user_pass varhcar(20) not null);</p>
<p>create tabel user_roles( user_name varchar(15) not null,</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; role_naem varchar(20) not null,</p>
<p>primary key(user_name,role_name));</p>
<p>现在简单介绍一下基本的验证方式</p>
<p>首先我们应该在web.xml文件中对需要保护的资源定义一个＜security-constraint&gt;比如你要限制ｕｒｌ为当前ｗｅｂ目中的所有文件/*</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<table cellspacing="0" border="1" bordercolor="#999999" bgcolor="#f1f1f1" width="95%" cellpadding="0" style="BORDER-COLLAPSE: collapse">
    <tbody>
        <tr>
            <td>
            <p style="MARGIN: 5px; LINE-HEIGHT: 150%"><code><span style="COLOR: #000000"><span style="COLOR: #0000cc">&lt;</span>security-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>web-resource-collection<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>web-resource-name<span style="COLOR: #0000cc">&gt;</span>BasicLogin<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>web-resource-name<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>url-pattern<span style="COLOR: #0000cc">&gt;</span><span style="COLOR: #0000cc">/</span><span style="COLOR: #0000cc">*</span><span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>url-pattern<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>http-method<span style="COLOR: #0000cc">&gt;</span>GET<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>http-method<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>http-method<span style="COLOR: #0000cc">&gt;</span>POST<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>http-method<span style="COLOR: #0000cc">&gt;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>web-resource-collection<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>auth-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>!-- NOTE: This role is not present in the default users file --<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>role-name<span style="COLOR: #0000cc">&gt;</span>tomcat<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>role-name<span style="COLOR: #0000cc">&gt;</span> <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>auth-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>user-data-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>description<span style="COLOR: #0000cc">&gt;</span> no description<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>description<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>transport-guarantee<span style="COLOR: #0000cc">&gt;</span>NONE<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>transport-guarantee<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>user-data-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            <span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>security-constraint<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<br />
            <span style="COLOR: #0000cc">&lt;</span>login-config<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>auth-method<span style="COLOR: #0000cc">&gt;</span>BASIC<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>auth-method<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #0000cc">&lt;</span>realm-name<span style="COLOR: #0000cc">&gt;</span>default<span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>realm-name<span style="COLOR: #0000cc">&gt;</span><br />
            <span style="COLOR: #0000cc">&lt;</span><span style="COLOR: #0000cc">/</span>login-config<span style="COLOR: #0000cc">&gt;</span><br />
            &nbsp;&nbsp;&nbsp;<br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;其中&lt;web-resource-collection&gt;标记中url-pattern制定保护了url,http-method定义了限定web的请求方法，&lt;auth-constrain&gt;标记了role-name制定了合法用户的角色。&lt;user-data-constraint&gt;中定义了不需要通信的保证。当然了还需要申明使用了基本的验证方式和使用默认的realm.声明部分在上面红色部分给出，即&lt;login-config&gt;.这样的话当浏览器请求</p>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/70252#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Apr 2007 11:57:40 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/70252</link>
        <guid>http://grandboy.javaeye.com/blog/70252</guid>
      </item>
      <item>
        <title>JBoss Hibernate 配置与应用(转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/69995" style="color:red;">http://grandboy.javaeye.com/blog/69995</a>&nbsp;
          发表时间: 2007年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">原文:&nbsp;&nbsp; <a href="http://www.javaeye.com/topic/68868">http://www.javaeye.com/topic/68868</a></font></p>
<p><strong>JBoss Hibernate 配置与应用</strong> <br />
作者:萧红叶 2007年4月4日</p>
<p>本文以一个jboss_hibernate为例介绍怎么把hibernate部署成一个jboss的service,然后用hibernate 去操作数据库。</p>
<p>配置开发环境 <br />
在进行开发之前，需要首先获得JBoss、MySQL、相应数据库的JDBC驱动类库。JBoss可以从www.jboss.org中下载，MySQL 从www.mysql.org 下载 <br />
解压jboss到一个文件夹,我们把mysql的jdbc驱动复制到jboss-4.2.0.CR1\server\default\lib下 <br />
然后我们配置一个mysql的数据源,从jboss-4.2.0.CR1\docs\examples\jca目录下复制一份mysql-ds.xml到jboss-4.2.0.CR1\server\default\deploy目录下,接着修改它的内容，我修改的如下： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">datasources</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">local-tx-datasource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>MySqlDS</span><span class="tag">&lt;/</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//jndi名字 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">use-java-context</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">use-java-context</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">connection-url</span><span class="tag">&gt;</span><span>jdbc:mysql://10.16.175.137:3306/test</span><span class="tag">&lt;/</span><span class="tag-name">connection-url</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//URL地址 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">driver-class</span><span class="tag">&gt;</span><span>com.mysql.jdbc.Driver</span><span class="tag">&lt;/</span><span class="tag-name">driver-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//驱动 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">user-name</span><span class="tag">&gt;</span><span>root</span><span class="tag">&lt;/</span><span class="tag-name">user-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;//用户名 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">password</span><span class="tag">&gt;</span><span>123456</span><span class="tag">&lt;/</span><span class="tag-name">password</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//密码 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">exception-sorter-class-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">exception-sorter-class-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">metadata</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">type-mapping</span><span class="tag">&gt;</span><span>mySQL</span><span class="tag">&lt;/</span><span class="tag-name">type-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">metadata</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">local-tx-datasource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">datasources</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>这样我们的mysql数据源就配置好了，接下来我们来做一个jboss_hibernate.har文件</p>
<p>进入到jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\deploy 新建一个jboss_hibernate.har文件夹,该目录下放的将是你的POJO 文件和对应的.hbm.xml文件以及jboss-service.xml文件。</p>
<p>在jboss_hibernate.har目录新建一个文件夹META-INF,在该目录下我们来写一个jboss-service.xml文件，代码如下:</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mbean</span><span>&nbsp;</span><span class="attribute">code</span><span>=</span><span class="attribute-value">&quot;org.jboss.hibernate.jmx.Hibernate&quot;</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jboss.har:service=Hibernate&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;DatasourceName&quot;</span><span class="tag">&gt;</span><span>MySqlDS</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//数据源名字 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;Dialect&quot;</span><span class="tag">&gt;</span><span>org.hibernate.dialect.MySQLDialect</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//对应hibernate的Dialect &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;SessionFactoryName&quot;</span><span class="tag">&gt;</span><span>java:/hibernate/SessionFactory</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//sessionFactory的jndi名字 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ShowSqlEnabled&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//在控制台输出sql语句 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ScanForMappingsEnabled&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//自动搜索mapping文件 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">mbean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>如果有多个数据库，你可以建多个数据源，然后在jboss-service.xml文件里写上多个mbean，我是这样做的，呵呵，不知道有没有更好的办法</p>
<p>接着我们来写我们的hibernate 文件</p>
<p>在jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\deploy\jboss_hibernae.har\目录下新建文件夹org.xredleaf,我们写一个对应数据库的User.java文件：</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.xredleaf; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.Serializable; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;User&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;&nbsp;&nbsp;&nbsp;age; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;User(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(String&nbsp;id){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id=id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getId(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setName(String&nbsp;name){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name=name; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setAge(</span><span class="keyword">int</span><span>&nbsp;age){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.age=age; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getAge(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;age; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script>然后将它编译成User.class文件 <br />
接着我们写XML映射文件User.hbm.xml 文件： </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;&quot;-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD//EN&quot;&nbsp;&quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">hibernate-mapping</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">class</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.xredleaf.User&quot;</span><span>&nbsp;</span><span class="attribute">table</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">id</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.String&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">generator</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;uuid.hex&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">id</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.String&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;age&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;age&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.Integer&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">hibernate-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>好了，这样我们的环境就搭好了!呵呵，喝口茶！</p>
<p>&nbsp;二、写一个登录页面</p>
<p>进入到jboss-4.2.0.CR1\server\default\deploy\jboss-web.deployer\ROOT.war目录下，新建一个login.jsp,文件如下：</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>&lt;%</span><span class="annotation">@page</span><span>&nbsp;contentType=</span><span class="string">&quot;text/html;charset=GB2312&quot;</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;% &nbsp;&nbsp;</span></li>
    <li class="alt"><span>javax.naming.InitialContext&nbsp;ctx&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;javax.naming.InitialContext(); &nbsp;&nbsp;</span></li>
    <li class=""><span>org.hibernate.SessionFactory&nbsp;factory&nbsp;=&nbsp;(org.hibernate.SessionFactory)ctx.lookup(</span><span class="string">&quot;java:/hibernate/SessionFactory&quot;</span><span>);&nbsp;</span><span class="comment">//之前配置的sessionFactory的名字 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>org.hibernate.Session&nbsp;se&nbsp;=&nbsp;factory.openSession(); &nbsp;&nbsp;</span></li>
    <li class=""><span>org.hibernate.Query&nbsp;query=se.createQuery(</span><span class="string">&quot;from&nbsp;org.xredleaf.User&nbsp;user&nbsp;&nbsp;where&nbsp;user.id='111'&nbsp;&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.util.List&nbsp;results=query.list(); &nbsp;&nbsp;</span></li>
    <li class=""><span>java.util.ListIterator&nbsp;iterator=results.listIterator(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(iterator.hasNext()){&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;org.xredleaf.User&nbsp;user=(org.xredleaf.User)iterator.next();&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span class="string">&quot;user&quot;</span><span>,user); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span class="string">&quot;Login&nbsp;success&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>%&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script>好了大功告成，我们来启动一下jboss,运行run.bat <br />
打开http://localhost:8080/login.jsp看一下，是不是显示Login success 啊 </p>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/69995#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Apr 2007 10:54:09 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/69995</link>
        <guid>http://grandboy.javaeye.com/blog/69995</guid>
      </item>
      <item>
        <title>JBoss Hibernate 配置与应用(转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/69994" style="color:red;">http://grandboy.javaeye.com/blog/69994</a>&nbsp;
          发表时间: 2007年04月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">原文:&nbsp;&nbsp; <a href="http://www.javaeye.com/topic/68868">http://www.javaeye.com/topic/68868</a></font></p>
<p><strong>JBoss Hibernate 配置与应用</strong> <br />
作者:萧红叶 2007年4月4日</p>
<p>本文以一个jboss_hibernate为例介绍怎么把hibernate部署成一个jboss的service,然后用hibernate 去操作数据库。</p>
<p>配置开发环境 <br />
在进行开发之前，需要首先获得JBoss、MySQL、相应数据库的JDBC驱动类库。JBoss可以从www.jboss.org中下载，MySQL 从www.mysql.org 下载 <br />
解压jboss到一个文件夹,我们把mysql的jdbc驱动复制到jboss-4.2.0.CR1\server\default\lib下 <br />
然后我们配置一个mysql的数据源,从jboss-4.2.0.CR1\docs\examples\jca目录下复制一份mysql-ds.xml到jboss-4.2.0.CR1\server\default\deploy目录下,接着修改它的内容，我修改的如下： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">datasources</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">local-tx-datasource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>MySqlDS</span><span class="tag">&lt;/</span><span class="tag-name">jndi-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//jndi名字 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">use-java-context</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">use-java-context</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">connection-url</span><span class="tag">&gt;</span><span>jdbc:mysql://10.16.175.137:3306/test</span><span class="tag">&lt;/</span><span class="tag-name">connection-url</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//URL地址 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">driver-class</span><span class="tag">&gt;</span><span>com.mysql.jdbc.Driver</span><span class="tag">&lt;/</span><span class="tag-name">driver-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//驱动 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">user-name</span><span class="tag">&gt;</span><span>root</span><span class="tag">&lt;/</span><span class="tag-name">user-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;//用户名 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">password</span><span class="tag">&gt;</span><span>123456</span><span class="tag">&lt;/</span><span class="tag-name">password</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//密码 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">exception-sorter-class-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">exception-sorter-class-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">metadata</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">type-mapping</span><span class="tag">&gt;</span><span>mySQL</span><span class="tag">&lt;/</span><span class="tag-name">type-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">metadata</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">local-tx-datasource</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">datasources</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>这样我们的mysql数据源就配置好了，接下来我们来做一个jboss_hibernate.har文件</p>
<p>进入到jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\deploy 新建一个jboss_hibernate.har文件夹,该目录下放的将是你的POJO 文件和对应的.hbm.xml文件以及jboss-service.xml文件。</p>
<p>在jboss_hibernate.har目录新建一个文件夹META-INF,在该目录下我们来写一个jboss-service.xml文件，代码如下:</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">mbean</span><span>&nbsp;</span><span class="attribute">code</span><span>=</span><span class="attribute-value">&quot;org.jboss.hibernate.jmx.Hibernate&quot;</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;jboss.har:service=Hibernate&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;DatasourceName&quot;</span><span class="tag">&gt;</span><span>MySqlDS</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//数据源名字 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;Dialect&quot;</span><span class="tag">&gt;</span><span>org.hibernate.dialect.MySQLDialect</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//对应hibernate的Dialect &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;SessionFactoryName&quot;</span><span class="tag">&gt;</span><span>java:/hibernate/SessionFactory</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//sessionFactory的jndi名字 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ShowSqlEnabled&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;//在控制台输出sql语句 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">attribute</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ScanForMappingsEnabled&quot;</span><span class="tag">&gt;</span><span>true</span><span class="tag">&lt;/</span><span class="tag-name">attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;//自动搜索mapping文件 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">mbean</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="tag">&lt;/</span><span class="tag-name">server</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>如果有多个数据库，你可以建多个数据源，然后在jboss-service.xml文件里写上多个mbean，我是这样做的，呵呵，不知道有没有更好的办法</p>
<p>接着我们来写我们的hibernate 文件</p>
<p>在jboss-4.2.0.CR1\jboss-4.2.0.CR1\server\default\deploy\jboss_hibernae.har\目录下新建文件夹org.xredleaf,我们写一个对应数据库的User.java文件：</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;org.xredleaf; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.Serializable; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;User&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;&nbsp;&nbsp;&nbsp;age; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;User(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(String&nbsp;id){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id=id; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getId(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setName(String&nbsp;name){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name=name; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setAge(</span><span class="keyword">int</span><span>&nbsp;age){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.age=age; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getAge(){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;age; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script>然后将它编译成User.class文件 <br />
接着我们写XML映射文件User.hbm.xml 文件： </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;!DOCTYPE&nbsp;hibernate-mapping&nbsp;PUBLIC&nbsp;&quot;-//Hibernate/Hibernate&nbsp;Mapping&nbsp;DTD//EN&quot;&nbsp;&quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">hibernate-mapping</span><span class="tag">&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">class</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;org.xredleaf.User&quot;</span><span>&nbsp;</span><span class="attribute">table</span><span>=</span><span class="attribute-value">&quot;user&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">id</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;id&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.String&quot;</span><span>&nbsp;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">generator</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;uuid.hex&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">id</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.String&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">property</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;age&quot;</span><span>&nbsp;</span><span class="attribute">column</span><span>=</span><span class="attribute-value">&quot;age&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;java.lang.Integer&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">hibernate-mapping</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script></p>
<p>&nbsp;</p>
<p>好了，这样我们的环境就搭好了!呵呵，喝口茶！</p>
<p>&nbsp;二、写一个登录页面</p>
<p>进入到jboss-4.2.0.CR1\server\default\deploy\jboss-web.deployer\ROOT.war目录下，新建一个login.jsp,文件如下：</p>
<p>&nbsp;</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>&lt;%</span><span class="annotation">@page</span><span>&nbsp;contentType=</span><span class="string">&quot;text/html;charset=GB2312&quot;</span><span>&nbsp;%&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;% &nbsp;&nbsp;</span></li>
    <li class="alt"><span>javax.naming.InitialContext&nbsp;ctx&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;javax.naming.InitialContext(); &nbsp;&nbsp;</span></li>
    <li class=""><span>org.hibernate.SessionFactory&nbsp;factory&nbsp;=&nbsp;(org.hibernate.SessionFactory)ctx.lookup(</span><span class="string">&quot;java:/hibernate/SessionFactory&quot;</span><span>);&nbsp;</span><span class="comment">//之前配置的sessionFactory的名字 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>org.hibernate.Session&nbsp;se&nbsp;=&nbsp;factory.openSession(); &nbsp;&nbsp;</span></li>
    <li class=""><span>org.hibernate.Query&nbsp;query=se.createQuery(</span><span class="string">&quot;from&nbsp;org.xredleaf.User&nbsp;user&nbsp;&nbsp;where&nbsp;user.id='111'&nbsp;&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>java.util.List&nbsp;results=query.list(); &nbsp;&nbsp;</span></li>
    <li class=""><span>java.util.ListIterator&nbsp;iterator=results.listIterator(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">if</span><span>(iterator.hasNext()){&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;org.xredleaf.User&nbsp;user=(org.xredleaf.User)iterator.next();&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span class="string">&quot;user&quot;</span><span>,user); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span class="string">&quot;Login&nbsp;success&quot;</span><span>);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>%&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p><script>render_code();</script>好了大功告成，我们来启动一下jboss,运行run.bat <br />
打开http://localhost:8080/login.jsp看一下，是不是显示Login success 啊 </p>
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/69994#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 11 Apr 2007 10:54:08 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/69994</link>
        <guid>http://grandboy.javaeye.com/blog/69994</guid>
      </item>
      <item>
        <title>[J2SE]安全：JAAS LoginModule(转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/69052" style="color:red;">http://grandboy.javaeye.com/blog/69052</a>&nbsp;
          发表时间: 2007年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Java认证和授权API（JAAS）为应用程序处理用户的认证和授权问题提供了标准方式。很多人在Unix/Linux系统中比较JAAS和PAM模块。 <br />
本文不对JAAS进行详细的讨论，但给大家简单的介绍一下。在JAAS架构中，当用户登录系统时，系统给用户一个Subject，Subject中包含有一个或多个Principal。每个Principal给用户提供身份验证，例如用户ID，也可以验证组和角色。Subject也包含公有的和私有的许可证（credential），例如X.509证书、私钥等。JAAS通过公开的Permission进行授权，Permission是在外部Policy 文件里进行维护的。本文也不讨论授权。就像下面所讨论的，实际的登录过程是由LoginModule来处理的。如果你想了解更多的信息，这里有相关 JAAS的详细介绍：http://www.javaworld.com/javaworld/jw-09-2002/jw-0913- jaas.html。 <br />
实现Hibernate JAAS LoginModule的第一步是定义一个或多个Principal。下面是一个典型的实例，但是记住你能把你想要的任何事物――用户ID，E-mail 地址，电话号码，公钥――填进Principal中是很重要的，这些事物都能在持久化的User对象中发现。 <br />
<br />
final public class HibernatePrincipal implements Principal { <br />
private String name; <br />
public HibernatePrincipal() { <br />
name = &quot;&quot;; <br />
} <br />
public HibernatePrincipal(String name) { <br />
this.name = name; <br />
} <br />
public String getName() { <br />
return name; <br />
} <br />
public int hashCode() { <br />
return name.hashCode(); <br />
} <br />
public boolean equals(Object o) { <br />
if (!(o instanceof HibernatePrincipal)) { <br />
return false; <br />
} <br />
return name.equals(((HibernatePrincipal) o).name); <br />
} <br />
public String toString() { <br />
return name; <br />
} <br />
} <br />
<br />
N.B.，你必须小心防止恶意用户通过继承你的类来获取他们所需要的许可证（credential）。解决上述问题的方法一是你可以声明你的Principal是final，二是你总是检查许可证（credential）是否是扩展类型。 <br />
<br />
public void foo(Principal p) { <br />
// DO NOT USE THIS <br />
if (p instanceof HibernatePrincipal) { <br />
... <br />
} <br />
// use this instead <br />
if (p.getClass().equals(HibernatePrincipal.class)) { <br />
... <br />
} <br />
// or even this <br />
if (p.getClass().getName().equals(HibernatePrincipal.getClass().getName()) { <br />
... <br />
} <br />
} <br />
} <br />
<br />
本文也不详细讨论许可证文件（credential），但User属性映射到Subject许可证是很容易的。例如，用户名可以作为公开许可证的一个合理候选。 <br />
既然有了Principal，我们可以为JAAS LoginModule包装一些标准的Hibernate代码。 <br />
/** <br />
* HibernateLoginModule is a LoginModule that authenticates <br />
* a given username/password credential against a Hibernate <br />
* session. <br />
* <br />
* @see javax.security.auth.spi.LoginModule <br />
*/ <br />
public class HibernateLoginModule implements LoginModule { <br />
<br />
// initial state <br />
CallbackHandler handler; <br />
Subject subject; <br />
Map sharedState; <br />
Map options; <br />
Digest digest; <br />
<br />
// temporary state <br />
Vector principals; <br />
<br />
// authentication status <br />
boolean success; <br />
<br />
// configurable options <br />
boolean debug; <br />
<br />
/** Hibernate session factory */ <br />
SessionFactory sf = null; <br />
<br />
/** Hibernate query */ <br />
private static final String query = <br />
&quot;from u in class &quot; + User.class + &quot; where u.name=?&quot;; <br />
<br />
public HibernateLoginModule() { <br />
credentials = new Vector(); <br />
principals = new Vector(); <br />
success = false; <br />
debug = false; <br />
} <br />
<br />
/** <br />
* Initialize our state. <br />
*/ <br />
public void initialize (Subject subject, CallbackHandler handler, <br />
Map sharedState, Map options) { <br />
<br />
this.handler = handler; <br />
this.subject = subject; <br />
this.sharedState = sharedState; <br />
this.options = options; <br />
<br />
if (options.containsKey(&quot;debug&quot;)) { <br />
debug = &quot;true&quot;.equalsIgnoreCase((String) options.get(&quot;debug&quot;)); <br />
} <br />
if (options.containsKey(&quot;digest&quot;)) { <br />
digest = new Digest((String) options.get(&quot;digest&quot;)); <br />
} else { <br />
digest = new Digest(); <br />
} <br />
<br />
// elided: standard code to get Hibernate =SessionFactory=. <br />
} <br />
<br />
/** <br />
* First phase of login process. <br />
*/ <br />
public boolean login() throws LoginException { <br />
if (handler == null) { <br />
throw new LoginException(&quot;Error: no CallbackHandler available&quot;); <br />
} <br />
<br />
try { <br />
Callback[] callbacks = new Callback[] { <br />
new NameCallback(&quot;User: &quot;), <br />
new PasswordCallback(&quot;Password: &quot;, false) <br />
}; <br />
<br />
handler.handle(callbacks); <br />
<br />
String username = ((NameCallback) callbacks[0]).getName(); <br />
char[] password = ((PasswordCallback) callbacks[1]).getPassword(); <br />
<br />
((PasswordCallback) callbacks[1]).clearPassword(); <br />
<br />
success = validate(username, password); <br />
<br />
callbacks[0] = null; <br />
callbacks[1] = null; <br />
<br />
if (!success) { <br />
throw new LoginException(&quot;Authentication failed: Password does not match&quot;); <br />
} <br />
return true; <br />
} catch (LoginException e) { <br />
throw e; <br />
} catch (Exception e) { <br />
success = false; <br />
throw new LoginException(e.getMessage()); <br />
} <br />
} <br />
<br />
/** <br />
* Second phase of login - by now we know user is authenticated <br />
* and we just need to update the subject. <br />
*/ <br />
public boolean commit() throws LoginException { <br />
if (success) { <br />
if (subject.isReadOnly()) { <br />
throw new LoginException(&quot;Subject is read-only&quot;); <br />
} <br />
<br />
try { <br />
Iterator i = principals.iterator(); <br />
subject.getPrincipals().addAll(principals); <br />
principals.clear(); <br />
return true; <br />
} catch (Exception e) { <br />
throw new LoginException(e.getMessage()); <br />
} <br />
} else { <br />
principals.clear(); <br />
} <br />
return true; <br />
} <br />
<br />
/** <br />
* Second phase - somebody else rejected user so we need to <br />
* clear our state. <br />
*/ <br />
public boolean abort() throws LoginException { <br />
success = false; <br />
logout(); <br />
return true; <br />
} <br />
<br />
/** <br />
* User is logging out - clear our information from the subject. <br />
*/ <br />
public boolean logout() throws LoginException { <br />
principals.clear(); <br />
<br />
// remove the principals the login module added <br />
Iterator i = subject.getPrincipals(HibernatePrincipal.class).iterator(); <br />
while (i.hasNext()) { <br />
HibernatePrincipal p = (HibernatePrincipal) i.next(); <br />
subject.getPrincipals().remove(p); <br />
} <br />
<br />
return true; <br />
} <br />
<br />
/** <br />
* Validate the user name and password. This is the Hibernate-specific <br />
* code. <br />
*/ <br />
private boolean validate(String username, char[] password) throws Exception { <br />
boolean valid = false; <br />
List users = null; <br />
<br />
Session s = null; <br />
try { <br />
s = sf.openSession(); <br />
users = (List) s.find(query, username, Hibernate.STRING); <br />
} catch (Exception e) { <br />
} finally { <br />
if (s != null) { <br />
try { s.close(); } catch (HibernateException e) { } <br />
} <br />
} <br />
<br />
// are there no matching records?... <br />
if (users == null || users.size() == 0) { <br />
return false; <br />
} <br />
<br />
// compare passwords... <br />
User user = (User) users.get(0); <br />
String hash = user.getPassword(); <br />
if (hash != null &amp;&amp; password != null &amp;&amp; password.length &gt; 0) { <br />
valid = hash.equals(digest.digest(new String(password))); <br />
} <br />
<br />
if (valid) { <br />
this.principals.add(new HibernatePrincipal(user.getId(), <br />
user.getName())); <br />
} <br />
return valid; <br />
} <br />
} <br />
例子中，我们利用了Tomcat类库中密码digest功能（password digest function）（你要为HexUtils类载入catalina.jar文件）。 <br />
import org.apache.catalina.util.HexUtils; <br />
<br />
/** <br />
* Quick and dirty password digest function. The HexUtils class <br />
* comes from the Tomcat catalina.jar. <br />
*/ <br />
public class Digest { <br />
<br />
static MessageDigest md = null; <br />
<br />
public Digest() { <br />
this(&quot;MD5&quot;); <br />
} <br />
<br />
public Digest(String digest) { <br />
try { <br />
md = MessageDigest.getInstance(digest); <br />
} catch (NoSuchAlgorithmException e) { <br />
try { <br />
md = MessageDigest.getInstance(&quot;MD5&quot;); <br />
} catch (NoSuchAlgorithmException e) { } <br />
} <br />
} <br />
<br />
/** <br />
* Digest function from Tomcat. <br />
*/ <br />
public String digest(String credentials) { <br />
if (md == null) { <br />
return credentials; <br />
} <br />
<br />
synchronized (this) { <br />
try { <br />
md.reset(); <br />
md.update(credentials.getBytes()); <br />
return (HexUtils.convert(md.digest())); <br />
} catch (Exception e) { <br />
return credentials; <br />
} <br />
} <br />
} <br />
} <br />
最后一步是为我们的应用程序配置我们的Hibernate登录模块。我们先创建JAAS配置文件，然后通过java.security.auth.login.config参数传给应用程序。在这个例子里我们定义JAAS属性&ldquo;Example&rdquo;。 <br />
Example { <br />
HibernateLoginModule required debug=&quot;true&quot;; <br />
}; <br />
现在通过我们Hibernate模块可以认证任何基于JAAS的应用程序了。下面是简单的测试程序： <br />
/** <br />
* simple CallbackHandler suitable for testing purposes <br />
*/ <br />
public static class Handler implements CallbackHandler { <br />
<br />
private Test t; <br />
private String username; <br />
private char[] credentials; <br />
<br />
public Handler(Test t, String username, char[] credentials) { <br />
super(); <br />
this.t = t; <br />
this.username = username; <br />
this.credentials = credentials; <br />
} <br />
<br />
public void handle(Callback callbacks[]) <br />
throws IOException, UnsupportedCallbackException { <br />
<br />
for (int i = 0; i &lt; callbacks.length; i++) { <br />
if (callbacks[i] instanceof NameCallback) { <br />
((NameCallback) callbacks[i]).setName(username); <br />
} <br />
else if (callbacks[i] instanceof PasswordCallback) { <br />
((PasswordCallback) callbacks[i]).setPassword(credentials); <br />
} else { <br />
throw new UnsupportedCallbackException(callbacks[i]); <br />
} <br />
} <br />
} <br />
} <br />
/** <br />
* Simple JAAS-aware application. <br />
*/ <br />
public class Test { <br />
<br />
LoginContext l = null; <br />
<br />
/** <br />
* attempt to log in as the user, returning the =Subject= <br />
* if successful. <br />
*/ <br />
public Subject login(String username, char[] credentials) { <br />
try { <br />
CallbackHandler cb = new Handler(this, username, credentials); <br />
l = new LoginContext(&quot;Example&quot;, cb); <br />
} catch (LoginException e) { <br />
return null; <br />
} <br />
<br />
Subject subject = null; <br />
try { <br />
l.login(); <br />
subject = l.getSubject(); <br />
if (subject == null) { <br />
return null; <br />
} <br />
} catch (AccountExpiredException e) { <br />
} catch (CredentialExpiredException e) { <br />
} catch (FailedLoginException e) { <br />
} catch (LoginException e) { <br />
} <br />
return subject; <br />
} <br />
<br />
/** <br />
* log out of application <br />
*/ <br />
public void logout() { <br />
if (l != null) { <br />
try { <br />
l.logout(); <br />
} catch (LoginException e) { <br />
} <br />
} <br />
} <br />
<br />
public static void main(String[] args) throws Exception { <br />
Test t = new Test(); <br />
String username = &quot;test&quot;; <br />
String password = &quot;test&quot;; <br />
<br />
Subject subj = t.login(username, password.toCharArray()); <br />
if (subj != null) { <br />
Iterator i = subj.getPrincipals(HibernatePrincipal.class).iterator(); <br />
while (i.hasNext()) { <br />
HibernatePrincipal p = (HibernatePrincipal) i.next(); <br />
System.out.println(&quot;logged in as: &quot; + p.getName()); <br />
} <br />
t.logout(); <br />
} <br />
else { <br />
System.out.println(&quot;unable to log in as user&quot;); <br />
} <br />
} <br />
} <br />
正如上文间接提到的，JAAS的真正威力不在于它处理用户登录的灵活性，而是通过Permissions提供的公开的安全模块和处理许可证的机制。
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/69052#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Apr 2007 21:19:49 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/69052</link>
        <guid>http://grandboy.javaeye.com/blog/69052</guid>
      </item>
      <item>
        <title>扩展JAAS (转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/69051" style="color:red;">http://grandboy.javaeye.com/blog/69051</a>&nbsp;
          发表时间: 2007年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用户认证和访问控制是大多数java应用的重要安全尺度，特别是J2EE应用。Java认证和权限服务(即JAAS)，J2SE1.4和1.5的核心API，描绘表达了新的安全标准。其提供了一个可插拔的(pluggable)和富有弹性的(flexible)框架(framework)允许开发者混合不同的安全机制和丰富的已经存在各种安全方面的资源。<br />
　　伴随着即将来临的J2SE1.5版本的发布，它包含了许多诸如加密技术、XML安全性、公钥机制（PKI）、Kerberos （是一个网络附加系统/协议，可以允许用户通过一个安全伺服器的服务来验证 自己。象远端登陆，远端拷贝，系统间的相互档拷贝和另外高风险任务的服务将被变 得相当安全和可控制。）和结盟认证（the federating identity）的增强！，JAAS将会在J2EE实现中扮演一个更加重要的角色。<br />
　　<br />
　　<strong>认证</strong><br />
　　认证就是校验一个用户拥有使用已经被企业用户注册机构证明了的身份鉴定的权限的处理过程。JAAS的认证机制建立于一整套可插拔的模块（参看图1）基础上。JAAS允许不同的验证模型在运行时可被插拔。客户应用总是通过登陆上下文对象和JAAS交互。<br />
　　认证处理过程典型的要经过下面的步骤：<br />
　　1、 生成一个LoginContext对象。这个LoginContext寻找配置文件以决定使用那个LoginModule。同样，可选择的，有可能传递一个CallbackHandler给LoginContext.<br />
　　2、 通过调用LoginContext的login方法执行认证，它会加载预定义的LoginModule去检验是否用户可以被认证。<br />
　　3、 如果用户被认证，那么用规则和标识和其所属项进行关联。<br />
　　4、 或者在登陆失败的情况下跑出一个LoginException<br />
　　5、 使用LoginContext的logout方法进行注销登陆<br />
　　<br />
　　在JAAS中，登陆是一个两阶段(two-phase)的处理过程。第一阶段是&ldquo;登陆（login）&rdquo;阶段（就像上面2所描述的）。这个阶段唯一的任务是认证。只要处理过程成功通过这个阶段，认证处理过程就进入了&ldquo;提交(commit)&rdquo;阶段（如上步骤3），这一阶段LoginModule的commit方法被调用去关联所属子项相关的规则和标识。<br />
　　在JAAS中一个所属子项表示一个认证实体，比如一个人或者一台设备。它包含了一整套法则和安全相关的属性诸如密码和加密密钥。在JAAS体系结构中，所属子项和其所附属的相关权限，扮演了重要的角色在认证过程当中。所有的认证模块当中，LoginModule是事实上的认证机制的借口。虽然LoginModule决没有得到直接调用客户应用的机会，但是他经由一个可插拔的模块提供了一个认证的具体类型，其实现了认证的算法并且决定实际的认证过程是怎样被执行的。<br />
　　SUN提供了几个默认的LoginModule 实现，在sun.com.security.auth.module包里有诸如JndiLoginModule,Krb2LoginModule,UnixLoginModule和NTLoginModule等几个LoginModule实现。因为JAAS登录结构体系是可扩展的，所以你只要在配置文件中指定使用哪个LoginModule模块就可以几乎全部插入任何LoginModule模块。<br />
　　如下即为一个配置文件的例子：<br />
　　MySample {<br />
　　com.sample.module.MyLoginModule required debug=true;<br />
　　};<br />
　　<br />
　　这里MySample是登录上下文环境(login context)的名字，当你生成一个新的LoginContext开始认证过程时它会被传入LoginContex的构造函数中。依据配置块提示，那个文本块提醒JAAS有关LoginModule在登录过程中应该被用来执行认证。另外，对于LoginModule，任何关于他的选项也可以在这里被指定。在执行登录这一步骤的过程中，CallbackHandler类被LoginModule类用来跟用户通信已便于取得认证信息。CallbackHandler类处理三种类型的回调（Callback）：NameCallback,提示用户输入一个用户名；PasswordCallcack,提示输入密码；TextOutputCallback,报告错误、警告或则发送给用户一些其他信息。<br />
　　<br />
　　授权是决定是否认证的用户可以执行一些动作的工作，例如访问一处资源。因为JAAS建立于已经存在的Java安全模型的基础上，故这个过程时基于策略的。策略配置文件实质上包含了一系列的入口，诸如&ldquo;Keystore&rdquo;和/或&ldquo;grant&rdquo;.<br />
　　grant入口包含了所有的权限，他是通过认证的代码或则法则被授予可以进行安全敏感的操作，例如，访问一个具体的Web页面或则本地的文件。JAAS支持基于法则的策略入口，赋权入口基本格式如下：<br />
　　grant Codebase &ldquo;codebase_URL&rdquo; Signedby &ldquo;signer_name,&rdquo;<br />
　　Principal principal_class_name &ldquo;principal_name&rdquo;,<br />
　　Principal principal_class_name &ldquo;principal_name&rdquo;,<br />
　　&hellip; {<br />
　　permission permission_class_name &ldquo;target_name&rdquo;, &ldquo;action&rdquo;,<br />
　　permission permission_class_name &ldquo;target_name&rdquo;, &ldquo;action&rdquo;,<br />
　　&hellip;<br />
　　}<br />
　　<br />
　　上面格式中&ldquo;动作（action）&rdquo;可能是必需的或则可能被忽略依赖于权限类型。在JAAS体系结构中，策略对象表达了一个Java应用环境的系统安全策略和在任何时间事实上只有一个策略对象。依据Java2 SDK文档，默认的策略实现是sun.security.provider.PolicyFile,其中策略被指定在一个或多个策略配置文件里。<br />
　　只要用户被认证，授权经由Subject.doAs方法发生，或者从Subject类的静态方法doAsPrivileged，doAS方法用当前的AccessControlContext动态和子项并且同时调用run方法去执行动作，他导致安全验证。权限验证过程通过下面的步骤在图2:<br />
　　就像LoginModule,策略也是可插拔的模型。你可以挂上其它的策略实现通过在java.security的属性文件中改变&ldquo;policy.provider=sun.security.provider.PolicyFile&rdquo;<br />
　　到一个你项使用的策略类。<br />
　　<br />
　　<strong>Extend JAAS</strong><br />
　　JAAS建立于已经存在的Java安全模型的顶端，其基于&ldquo;CodeSource&rdquo;和平面文本格式策略文件实现。这可能对企业应用是不够用的，你可能想使用可定制的安全仓库。对于JAAS的其它实现,诸如LDAP(轻型目录访问协议)，数据库或者其他文件系统，它可以通过编写你自己的可定制模块被完成，感谢JAAS的可插拔的特性。然而，这需要对模块和JAAS中的处理过程有完善的理解，同时你必须做许多编码去覆写相关的类，并且处理好配置和策略两种文件。<br />
　　理想情况下，我们愿意能够扩展JAAS以一个更加容易的方式以便于无论何时一个可定制的安全知识库或者不同的访问控制机制改变或者必须去增加时，你能够只开发和插入这些不同的小模块（即，适配器）去适应这些新的变化和需求，并且在最好的情况下，不必去理解和熟悉JAAS处理过程的细节，同样，我们也愿意能够去做这些变化仅仅通过改变一个配置文件。另一个目标是我们的JAAS扩展组件能够被使用在不同的J2EE应用中&mdash;独立的或者Web上的。图3描述了JAAS扩展组件的设计意图。我们的JAAS扩展组在实现可定制的LoginModule和策略模块时充分件利用了JAAS插拔式的体系结构。这些模块中，我们委派数据请求到适配器。这些适配器的每个对于诸如数据取回的简单任务是隔离的，所以你可以快速地使用不同的安全知识或者算法开发不同的适配器而不是尝试去实现不同的LoginModule或者策略模块，它们更加复杂并且需要更多的努力。<br />
　　你可以从www.sys-con.com/java/sourcec.cfm.下在完整的源玛。<br />
　　<br />
　　<strong>实现的AuthLoginModule类</strong><br />
　　AuthLoginModule类是我们定制的LoginModule实现，LoginModule类是在JAAS中是一个可插拔组件并且服务于两个目的：<br />
　　1、鉴定认证用户<br />
　　2、如果认证成公，则用相关的负责人信息或者证书更新主题。<br />
　　<br />
　　LoginModule有5个方法去实现功能，让我们关注一下login()方法。这个方法被调用以认证主题并且主要作两件事情：<br />
　　1、包含用户名和密码，典型地，LoginModule要调用CallbackHandler类的handle方法去得到用户名和密码<br />
　　2、通过和数据源中的比较校验密码。LoginModule从Callbacks取回用户名和密码。(其默认期望用户接口的某种排序)，这一点对于一个简单的演示程序或者就在命令行，可是他对于一个J2EE应用来说不太实用，例如，对于大多数的Web应用，用户名和密码将比较典型的从一个form中读出。在这种情况下，使用JAAS认证会比较困难。考虑我们不直接使用LoginModule,解决方案是实现一个可定制的CallbackHandler类，他会接收用户名和密码然后递交它们给LoginModule，所以他没有必要提示用户输入信息<br />
　　<br />
　　以下示例説明用户信息如何从JSP或者Servlet中传递：<br />
　　String userName = request.getParameter (&ldquo;user&rdquo;);<br />
　　String password = request.getParameter(&ldquo;password&rdquo;);<br />
　　LoginContext context = new LoginContext (&ldquo;MySample&rdquo;,<br />
　　new AuthCallbackHandler (userName, password));<br />
　　<br />
　　一旦拥有了用户名和密码在手，AuthLoginModule类，我们的LoginModule类的定制实现，会经由LoginSourceAdapterFactory实例化LoginSourceAdapter并同时委派实际的认证过程到资源适配器。适配器只不过是一个简单的类，其从一个具体的数据适配器（比如数据库或者LDAP,或者一些别的系统）领取用户信息。在&ldquo;提交&rdquo;阶段，AuthLoginModule类从LoginSourceAdapter类取回相关的信息并且把他们和主题相关联。<br />
　　<br />
　　LoginSourceAdapter类<br />
　　LoginSourceAdapter类是一个认证目的的资源适配器的接口，它有4个需要实现的方法：<br />
　　1、void initialize(Hashtable parameters):initialized方法被调用来以相关的参数初始化适配器。此方法在对象生成后立即被调用并且优先于任何对其他方法的调用。<br />
　　2、boolean authenticate(String username,char[] password):此认证方法被调用来认证用户。<br />
　　3. String[] getGroupNames (String userName):getGroupNames方法被调用来在认证成功后得到相关的主要信息。<br />
　　4. void terminate ():这个方法在LoginModule类的logout方法被执行后调用，它给适配器做一些清理工作的机会。
          <br/>
          <span style="color:red;">
            <a href="http://grandboy.javaeye.com/blog/69051#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Apr 2007 21:18:27 +0800</pubDate>
        <link>http://grandboy.javaeye.com/blog/69051</link>
        <guid>http://grandboy.javaeye.com/blog/69051</guid>
      </item>
      <item>
        <title>编写自己的登录与访问控制模块(转载)</title>
        <author>grandboy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://grandboy.javaeye.com/blog/69049" style="color:red;">http://grandboy.javaeye.com/blog/69049</a>&nbsp;
          发表时间: 2007年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font class="contentwithhtml">&nbsp;原地址:&nbsp;<font face="Arial"><a href="http://www.smth.org/pc/pccon.php?id=3559&amp;nid=74518&amp;s=all">http://www.smth.org/pc/pccon.php?id=3559&amp;nid=74518&amp;s=all</a></font></font></p>
<div>
<pre><p>小按：<br />第一次写心得笔记，手都有点抖，班门弄斧啊，呵呵～～～欢迎各位大侠扔砖！<br />本文是一篇学习笔记，概要介绍了Java登录与授权机制及其应用。<br />在一些用到的API关键字上做了链接，可以在线查相应的文档。</p></pre>
</div>
<pre>=======================================================================================</pre>
<div class="postText">
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 安全性是</font><a href="http://java.sun.com/" target="_blank"><font size="2">Java</font></a><font size="2">鼓吹得最多的特性之一，的确，</font><a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/index.html" target="_blank"><font size="2">Java的安全特性</font></a><font size="2">涵盖了从应用级别到语言级别乃至</font><a href="http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html" target="_blank"><font size="2">JVM</font></a><font size="2">本身。以前大家都知道有个</font><a href="http://java.sun.com/j2se/1.4.2/docs/guide/security/spec/security-spec.doc1.html" target="_blank"><font size="2">Sandbox</font></a><font size="2">，但仅有Sandbox尚不能满足，或者说不能很方便地做到我们所需要的全部安全需求，譬如现在一个系统首先起码需要一个登录功能，更进一步的话，还需要对用户访问资源的行为进行约束，下面我想大致讲一下Java是怎样做这些事情的，基本上是一个总结或者说是&ldquo;读后感&rdquo;的性质，同时给出一个简单的实现例子，这个例子其实还是模仿人家的，呵呵&hellip;&hellip;<br />
</font></p>
<h5><u><font size="4" face="黑体">1．Java的访问控制机制</font></u></h5>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 谈到访问控制，或者说&ldquo;授权&rdquo;，这里有两层含义，一是从资源的角度，这个socket端口是否被允许操作？这个文件是可读的？可写的？还是可执行的？还是以上都行？这就是我们在UNIX下用&ldquo;ls -l&rdquo;命令列出当前目录下文件时，那些&ldquo;-rwx-&rdquo;之类的含义；二是从访问者的角度，我想通过80端口看Web上新浪欧洲杯的新闻，在这个系统中有没有这个资格？我想播放D盘上一个名为&ldquo;friends.rm&rdquo;的视频文件，我得到了访问这个文件的权限了吗？我有运行播放器的权限吗？<br />
&nbsp;&nbsp;&nbsp;&nbsp; Java在访问控制策略上同时考虑了这两方面内容，你说&ldquo;不对呀，我用</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileOutputStream.html" target="_blank"><font size="2" color="#002c99">FileOutputStream</font></a><font size="2">写文件，用</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/net/Socket.html" target="_blank"><font size="2" color="#002c99">Socket</font></a><font size="2">类连接远程主机都用得好好的，没什么限制呀&rdquo;，这我们得先谈谈什么叫做&ldquo;<strong>安全管理器</strong>&rdquo;（</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/SecurityManager.html" target="_blank"><font size="2" color="#002c99">SecurityManger</font></a><font size="2">）。安全管理器从JDK 1.0就开始有了，多古老啊！Java从设计的那一天开始就考虑了安全因素，安全管理器是Sandbox的最重要的一个部分，也是访问控制的总协调者，我们能够在通常情况下正常使用网络和文件，那是因为当启动application的时候（<strong>注意是application，不是applet！</strong>），如果你不加&ldquo;<strong>-Djava.security.manager</strong>&rdquo;选项，JVM是不会启动Sandbox的，这时你可以&ldquo;为所欲为&rdquo;，而不会碰到</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/SecurityException.html" target="_blank"><font size="2" color="#002c99">SecurityException</font></a><font size="2">之类的异常；一旦加入了&ldquo;-Djava.security.manager&rdquo;选项，你就会发现有一连串的异常出现喽！<br />
<br />
<font style="BACKGROUND-COLOR: #d3d3d3">Exception in thread <font color="#000000">&quot;main&quot; </font>java.security.AccessControlException: access denied (&hellip;&hellip;)<br />
&hellip;&hellip;</font><br />
<br />
Java内置了一个默认的安全策略，这种情况下安全管理器首先装载的是这个默认的策略，不信啊，不信你检查一下你的&ldquo;%JAVA_HOME%\jre\lib\security\&rdquo;目录，是不是有个叫&ldquo;<strong>java.policy</strong>&rdquo;的文件？用notepad打开看看：</font></p>
<p><font size="2"></font><font size="2"><br />
</font><font size="2"><font style="BACKGROUND-COLOR: #d3d3d3"><em><font color="#006600">//&nbsp;Standard&nbsp;extensions&nbsp;get&nbsp;all&nbsp;permissions&nbsp;by&nbsp;default<br />
</font></em>grant&nbsp;codeBase&nbsp;<font color="#000099">&quot;file:${java.home}/lib/ext/*&quot;</font>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.security.AllPermission;<br />
};<br />
<font color="#006600"><em>//&nbsp;default&nbsp;permissions&nbsp;granted&nbsp;to&nbsp;all&nbsp;domains</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3"><font color="#000000">grant&nbsp;{&nbsp;<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;Allows&nbsp;any&nbsp;thread&nbsp;to&nbsp;stop&nbsp;itself&nbsp;using&nbsp;the&nbsp;java.lang.Thread.stop()</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;method&nbsp;that&nbsp;takes&nbsp;no&nbsp;argument.</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;Note&nbsp;that&nbsp;this&nbsp;permission&nbsp;is&nbsp;granted&nbsp;by&nbsp;default&nbsp;only&nbsp;to&nbsp;remain</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;backwards&nbsp;compatible.</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;It&nbsp;is&nbsp;strongly&nbsp;recommended&nbsp;that&nbsp;you&nbsp;either&nbsp;remove&nbsp;this&nbsp;permission</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;from&nbsp;this&nbsp;policy&nbsp;file&nbsp;or&nbsp;further&nbsp;restrict&nbsp;it&nbsp;to&nbsp;code&nbsp;sources</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;that&nbsp;you&nbsp;specify,&nbsp;because&nbsp;Thread.stop()&nbsp;is&nbsp;potentially&nbsp;unsafe.</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3">&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;See&nbsp;&quot;http://java.sun.com/notes&quot;&nbsp;for&nbsp;more&nbsp;information.</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.lang.RuntimePermission</font>&nbsp;<font color="#000099">&quot;stopThread&quot;</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;allows&nbsp;anyone&nbsp;to&nbsp;listen&nbsp;on&nbsp;un-privileged&nbsp;ports</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.net.SocketPermission</font>&nbsp;<font color="#000099">&quot;localhost:1024-&quot;</font>,&nbsp;<font color="#000099">&quot;listen&quot;</font>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#006600"><em>//&nbsp;&quot;standard&quot;&nbsp;properies&nbsp;that&nbsp;can&nbsp;be&nbsp;read&nbsp;by&nbsp;anyone</em><br />
<font size="2"><font style="BACKGROUND-COLOR: #d3d3d3"><font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vendor&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vendor.url&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.class.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
&nbsp;<font color="#000000">&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;os.name&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;os.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;os.arch&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;file.separator&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;path.separator&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;line.separator&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
&nbsp;<font color="#000000">&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.specification.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.specification.vendor&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.specification.name&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.specification.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.specification.vendor&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.specification.name&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.version&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.vendor&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">&nbsp;&nbsp;&nbsp;&nbsp;permission&nbsp;java.util.PropertyPermission</font>&nbsp;<font color="#000099">&quot;java.vm.name&quot;</font>,&nbsp;<font color="#000099">&quot;read&quot;</font>;<br />
<font color="#000000">};</font></font><br />
<br />
<font color="#000000" style="BACKGROUND-COLOR: #ffffff">可以看到，JVM给沙箱内的application分配的权限仅限于中止线程，监听1024以上的TCP端口，以及对一些系统属性的读取权限，像一般的socket操作和文件操作的权限都没有。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 了解了安全管理器的概念以后我们回到授权问题上来。对用户来说，最担心的莫过于机器中病毒，病毒本质上是一种恶意的程序，所以访问控制首先是要对代码的权限进行控制，上面我一直都在谈Sandbox，也就是所谓的&ldquo;<strong>沙箱</strong>&rdquo;，熟悉Java安全性发展历史的朋友大概对它不会陌生，初期的Java是采用这样一种安全策略，即：<strong>本地代码是可信的，而远程代码是不可信的</strong>，譬如applet是一种从网络上下载到本地并在浏览器上运行的一段远程代码，因而是不可信的，所以早期的applet被完全置于Sandbox当中，得到的权限是非常有限的；在1.0以后，直至Java 2出现之前，安全策略作了一些灵活的改变，applet不再是完全被歧视的&ldquo;二等公民&rdquo;了，因为有了<strong>签名applet</strong>，用户可以选择信任这种经过签名的applet，从而applet也可以做一些以前被认为是&ldquo;出格&rdquo;的事情；到了Java 2，情况又变了，以前一向被信任的本地代码似乎也变得不是那么可靠了，这还真说不准，难保谁不会在你出去跟女朋友逛街的时候，偷偷溜进来在你机器上拷个病毒什么的 ^_^ ，这样本地代码就落到了和远程代码相等同的地位了，这是比较符合现实世界场景的，在Java 2中的安全策略被称之为&ldquo;<strong>可配置的安全策略</strong>&rdquo;，任何代码，只要是通过安全管理器访问，就必须为它预先设定好访问权限，在这个之外的资源还是别的什么东东，对不起，<font style="BACKGROUND-COLOR: #d3d3d3">java.security.AccessControlException: access denied&hellip;&hellip;</font><font style="BACKGROUND-COLOR: #ffffff"> </font>此路不通！</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><font size="2"><br />
&nbsp;&nbsp;&nbsp;&nbsp;简单总结一下Java安全模型的发展史，大概就是下面的几幅图了：<br />
<img src="http://www.newsmth.org/pc/pcdownload.php?fid=9277" align="baseline" alt="" /><br />
<br />
<br />
<img src="http://www.newsmth.org/pc/pcdownload.php?fid=9278" align="baseline" alt="" /><br />
<br />
<img src="http://www.newsmth.org/pc/pcdownload.php?fid=9279" align="baseline" alt="" /><br />
</font></p>
<h5><u><font size="4" face="黑体">2．了解几个主要的API</font></u></h5>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; JAAS的API基本上位于javax.security.auth包及其下属子包中，很容易找到的。</font></p>
<li><font size="2">javax.security.auth.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/Subject.html" target="_blank"><font size="2" color="#002c99">Subject</font></a><br />
<font size="2">&nbsp;&nbsp;&nbsp; &nbsp;Subject表征系统中一个认证的用户，这个词时而被译为&ldquo;主题&rdquo;时而被以为&ldquo;主体&rdquo;（下面我要谈到的Principal有时候也被译为&ldquo;主体&rdquo;），不管它有几个马甲，反正你就可以看成是在Java中你这个人的影子，你对系统的访问就体现为Subject.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/Subject.html#doAs(javax.security.auth.Subject,%20java.security.PrivilegedAction)" target="_blank"><font size="2" color="#002c99">doAs</font></a><font size="2">()或Subject.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/Subject.html#doAsPrivileged(javax.security.auth.Subject,%20java.security.PrivilegedAction,%20java.security.AccessControlContext)" target="_blank"><font size="2" color="#002c99">doAsPrivileged</font></a><font size="2">()方法。</font>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 由于现在普遍是多用户的系统，所以在实现代码级访问控制之外，我们还希望能够对用户的行为进行约束，因为对系统造成破坏的因素不仅仅是恶意代码，人自身的有意或无意的不当操作也会危及系统，譬如向上面说的你不在的时候别人可以在你机器上拷病毒，如果系统能在你不在的时候也能拒绝这个家伙的登录企图，那样麻烦岂不是少很多？于是在Java安全核心之外，提供了一个名为&ldquo;<strong>Java认证与授权服务</strong>&rdquo;（Java Authentication and Authorization Services，JAAS）东东，专门用来处理对用户的认证和授权，这也就是所谓的&ldquo;<strong>以用户为中心的授权模型</strong>&rdquo;，说白了就是在&ldquo;<strong>以代码为中心的授权模型</strong>&rdquo;上再加一层，首先用户要获得访问权限，然后用户去操纵代码，代码来实行真正的访问操作。下面我主要是讲讲JAAS是如何工作的。<br />
<br />
</p>
</li>
</div>
<div class="postText">
<li><font size="2">java.security.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/java/security/Principal.html" target="_blank"><font size="2" color="#002c99">Principal</font></a><br />
<font size="2">&nbsp; &nbsp;&nbsp; Principal代表用户的一种身份对象，一个用户的身份可能不只一个，他所在的组或所担任的角色也是一种身份，&ldquo;张翠山&rdquo;可以说&ldquo;铁划银钩&rdquo;，可以说&ldquo;张三丰的徒弟&rdquo;，可以说&ldquo;张无忌他老爹&rdquo;，我说&ldquo;武当七侠&rdquo;甚至&ldquo;武当派&rdquo;，当然也没错，这是一个组，呵呵。通过一次登录后，可能向Subject插入一个或多个Principal，这时候Subject才有实际意义，而不是一个空壳。</font> </li>
<li><font size="2">javax.security.auth.login.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/login/LoginContext.html" target="_blank"><font size="2" color="#002c99">LoginContext</font></a><br />
<font size="2">&nbsp;&nbsp;&nbsp; &nbsp;LoginContext旨在提供一个开放的登录总接口，你只需要用从策略文件中取得的策略名，以及下面介绍的回调对象创建得到一个LoginContext，再调用一次</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/login/LoginContext.html#login()" target="_blank"><font size="2" color="#002c99">login</font></a><font size="2">()方法即可完成登录，登录模块在这里是透明的。</font> </li>
<li><font size="2">javax.security.auth.spi.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html" target="_blank"><font size="2" color="#002c99">LoginModule</font></a><br />
<font size="2">&nbsp;&nbsp; &nbsp; 登录模块实现了对用户的认证逻辑，它的作用是在登录配置文件中得到体现，在后面的例子里我们会看到怎么编写一个登录配置文件以及上面说过的策略文件。LoginModule接口包括五个主要的方法：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html#initialize(javax.security.auth.Subject,%20javax.security.auth.callback.CallbackHandler,%20java.util.Map,%20java.util.Map)" target="_blank"><font size="2" color="#002c99">initialize</font></a><font size="2">方法，初始化模块，保存当前Subject以及一些参数。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html#login()" target="_blank"><font size="2" color="#002c99">login</font></a><font size="2">方法，判断一次登录过程中是否认证通过。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html#commit()" target="_blank"><font size="2" color="#002c99">commit</font></a><font size="2">方法，是否提交登录结果。咦，login不就行了吗？干吗要来个提交呢？这是因为JAAS采用的是类似于数据库事务处理的过程，<strong>将整体登录分为两阶段</strong>，尽管你login成功，但系统仍有权力根据你这次login的&ldquo;地位&rdquo;来决定究竟要不要接纳你的身份，只有通过commit，用户的Principal才会被真正添加到Subject当中，哼哼，真阴险！这里所说的login的&ldquo;地位&rdquo;是指策略文件中登录模块的&ldquo;控制标记&rdquo;选项，有点类似于优先级的概念，因为登录一个系统的过程可能会经过不止一个登录模块，譬如我们登录系统输入口令，但这个口令可能保存在一个数据库或LDAP目录中，访问这个数据源也需要经过认证，这就不止一个登录模块了吧？所以我们需要分清哪些认证过程是重要的，哪些又是次要的，系统对用户身份的接收与否是对这些策略综合权衡的结果。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html#abort()" target="_blank"><font size="2" color="#002c99">abort</font></a><font size="2">方法：哎呀，上面解释得是不是太多了？我们再看看abort，还记得数据库事务处理的回退过程（roll back）吗？abort就有点像roll back，表示系统并不接受你的身份，以前做过的统统作废，现场又恢复到和登录前完全一样。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/spi/LoginModule.html#logout()" target="_blank"><font size="2" color="#002c99">logout</font></a><font size="2">方法：注销过程，清除内部状态，并删除Subject中全部的Principal。</font>&nbsp; </li>
<li><font size="2">javax.security.auth.callback.</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/callback/CallbackHandler.html" target="_blank"><font size="2" color="#002c99">CallbackHandler</font></a><br />
<font size="2">&nbsp;&nbsp; &nbsp; 回调对象是JAAS中用以将交互过程和认证逻辑分离的一种机制，这也是符合OO和松散耦合（loosely coupled是一个时髦词汇 ^_^）精神的。JAAS已经实现了一些常用的回调对象，包括取得用户名的</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/callback/NameCallback.html" target="_blank"><font size="2" color="#002c99">NameCallback</font></a><font size="2">，取得口令的</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/callback/PasswordCallback.html" target="_blank"><font size="2" color="#002c99">PasswordCallback</font></a><font size="2">，从终端获得输入文本的</font><a href="http://java.sun.com/j2se/1.4.2/docs/api/javax/security/auth/callback/TextInputCallback.html" target="_blank"><font size="2" color="#002c99">TextInputCallback</font></a><font size="2">，向终端发出文本消息的</font><a href="http:/