﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-技术细节是魔鬼</title><link>http://www.blogjava.net/thinkbase/</link><description>以软件开发技术为主要内容, 关注于 Java, Python, Javascript 等开发技术, 同时也会涉及各种 Open Source 的小工具 :)</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 06:53:46 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 06:53:46 GMT</pubDate><ttl>60</ttl><item><title> HttpClient POST 的 UTF-8 编码问题</title><link>http://www.blogjava.net/thinkbase/archive/2006/10/31/HttpClientPOST_UTF8.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Tue, 31 Oct 2006 15:00:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/10/31/HttpClientPOST_UTF8.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/78376.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/10/31/HttpClientPOST_UTF8.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/78376.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/78376.html</trackback:ping><description><![CDATA[原文来自: <a href="http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98">HttpClient POST 的 UTF-8 编码问题</a><div class="tagsList" id="tagsList" align="right"><hr size="2" width="100%" />
                  类别标签:
                  <span><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=UTF-8">UTF-8  </a><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=encoding">encoding  </a><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=http-client">http-client  </a><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=java">java</a></span></div><span class="pageHeader"><a href="http://thinkbase.net/w/main/Wiki?action=action_search&amp;text=%22HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98%22"></a></span><p>
          Apache HttpClient ( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://jakarta.apache.org/commons/httpclient/">http://jakarta.apache.org/commons/httpclient/</a> ) 是一个纯 Java 的HTTP 协议的客户端编程工具包, 对 HTTP 协议的支持相当全面, 更多细节也可以参考IBM 网站上的这篇文章 <a href="http://thinkbase.net/w/main/Wiki?HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98-Ref-IBM">HttpClient入门</a> ( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/">http://www-128.ibm.com/developerworks/cn/opensource/os-httpclient/</a> ).<br /><br /></p><h3>问题分析</h3>不过在实际使用中, 还是发现按照最基本的方式调用 HttpClient 时, 并不支持 UTF-8 编码,
在网络上找过一些文章, 也不得要领, 于是查看了 commons-httpclient-3.0.1 的一些代码, 首先在 PostMethod
中找到了 generateRequestEntity() 方法:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --><center><table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top"><code><font color="#ffffff">    </font><font color="#008000">/**</font><br /><font color="#ffffff">     </font><font color="#008000">* Generates a request entity from the post parameters, if present.  Calls</font><br /><font color="#ffffff">     </font><font color="#008000">* </font><font color="#008000">{@link EntityEnclosingMethod#generateRequestBody()} </font><font color="#008000">if parameters have not been set.</font><br /><font color="#ffffff">     </font><font color="#008000">* </font><br /><font color="#ffffff">     </font><font color="#008000">* </font><font color="#005500">@since </font><font color="#008000">3.0</font><br /><font color="#ffffff">     </font><font color="#008000">*/</font><br /><font color="#ffffff">    </font><font color="#0000c0"><b>protected </b></font><font color="#000000">RequestEntity generateRequestEntity</font><font color="#000000">() {</font><br /><font color="#ffffff">        </font><font color="#0000c0"><b>if </b></font><font color="#000000">(</font><font color="#000000">!</font><font color="#0000c0"><b>this</b></font><font color="#000000">.params.isEmpty</font><font color="#000000">()) {</font><br /><font color="#ffffff">            </font><font color="#008000">// Use a ByteArrayRequestEntity instead of a StringRequestEntity.</font><br /><font color="#ffffff">            </font><font color="#008000">// This is to avoid potential encoding issues.  Form url encoded strings</font><br /><font color="#ffffff">            </font><font color="#008000">// are ASCII by definition but the content type may not be.  Treating the content</font><br /><font color="#ffffff">            </font><font color="#008000">// as bytes allows us to keep the current charset without worrying about how</font><br /><font color="#ffffff">            </font><font color="#008000">// this charset will effect the encoding of the form url encoded string.</font><br /><font color="#ffffff">            </font><font color="#000000">String content = EncodingUtil.formUrlEncode</font><font color="#000000">(</font><font color="#000000">getParameters</font><font color="#000000">()</font><font color="#000000">, getRequestCharSet</font><font color="#000000">())</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#000000">ByteArrayRequestEntity entity = </font><font color="#0000c0"><b>new </b></font><font color="#000000">ByteArrayRequestEntity</font><font color="#000000">(</font><br /><font color="#ffffff">                </font><font color="#000000">EncodingUtil.getAsciiBytes</font><font color="#000000">(</font><font color="#000000">content</font><font color="#000000">)</font><font color="#000000">,</font><br /><font color="#ffffff">                </font><font color="#000000">FORM_URL_ENCODED_CONTENT_TYPE</font><br /><font color="#ffffff">            </font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>return </b></font><font color="#000000">entity;</font><br /><font color="#ffffff">        </font><font color="#000000">} </font><font color="#0000c0"><b>else </b></font><font color="#000000">{</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>return super</b></font><font color="#000000">.generateRequestEntity</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></center><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><br />
原来使用 NameValuePair 加入的 HTTP 请求的参数最终都会转化为 RequestEntity 提交到 HTTP 服务器, 接着在 PostMethod 的父类 EntityEnclosingMethod 中找到了如下的代码:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --><center><table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top"><code><font color="#ffffff">    </font><font color="#008000">/**</font><br /><font color="#ffffff">     </font><font color="#008000">* Returns the request's charset.  The charset is parsed from the request entity's </font><br /><font color="#ffffff">     </font><font color="#008000">* content type, unless the content type header has been set manually. </font><br /><font color="#ffffff">     </font><font color="#008000">* </font><br /><font color="#ffffff">     </font><font color="#008000">* </font><font color="#005500">@see </font><font color="#008000">RequestEntity#getContentType()</font><br /><font color="#ffffff">     </font><font color="#008000">* </font><br /><font color="#ffffff">     </font><font color="#008000">* </font><font color="#005500">@since </font><font color="#008000">3.0</font><br /><font color="#ffffff">     </font><font color="#008000">*/</font><br /><font color="#ffffff">    </font><font color="#0000c0"><b>public </b></font><font color="#000000">String getRequestCharSet</font><font color="#000000">() {</font><br /><font color="#ffffff">        </font><font color="#0000c0"><b>if </b></font><font color="#000000">(</font><font color="#000000">getRequestHeader</font><font color="#000000">(</font><font color="#990000">"Content-Type"</font><font color="#000000">) </font><font color="#000000">== </font><font color="#0000c0"><b>null</b></font><font color="#000000">) {</font><br /><font color="#ffffff">            </font><font color="#008000">// check the content type from request entity</font><br /><font color="#ffffff">            </font><font color="#008000">// We can't call getRequestEntity() since it will probably call</font><br /><font color="#ffffff">            </font><font color="#008000">// this method.</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>if </b></font><font color="#000000">(</font><font color="#0000c0"><b>this</b></font><font color="#000000">.requestEntity != </font><font color="#0000c0"><b>null</b></font><font color="#000000">) {</font><br /><font color="#ffffff">                </font><font color="#0000c0"><b>return </b></font><font color="#000000">getContentCharSet</font><font color="#000000">(</font><br /><font color="#ffffff">                    </font><font color="#0000c0"><b>new </b></font><font color="#000000">Header</font><font color="#000000">(</font><font color="#990000">"Content-Type"</font><font color="#000000">, requestEntity.getContentType</font><font color="#000000">()))</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#000000">} </font><font color="#0000c0"><b>else </b></font><font color="#000000">{</font><br /><font color="#ffffff">                </font><font color="#0000c0"><b>return super</b></font><font color="#000000">.getRequestCharSet</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">            </font><font color="#000000">}</font><br /><font color="#ffffff">        </font><font color="#000000">} </font><font color="#0000c0"><b>else </b></font><font color="#000000">{</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>return super</b></font><font color="#000000">.getRequestCharSet</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></center><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><br /><br /><h3>解决方案</h3>从上面两段代码可以看出是 HttpClient 是如何依据 "Content-Type" 获得请求的编码(字符集),
而这个编码又是如何应用到提交内容的编码过程中去的. 按照这个原来, 其实我们只需要重载 getRequestCharSet() 方法,
返回我们需要的编码(字符集)名称, 就可以解决 UTF-8 或者其它非默认编码提交 POST 请求时的乱码问题了.<br /><br /><h3>测试</h3>首先在 Tomcat 的 ROOT WebApp 下部署一个页面 test.jsp, 作为测试页面, 主要代码片段如下:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --><center><table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top"><code><font color="#000000">&lt;%@ page contentType=</font><font color="#990000">"text/html;charset=UTF-8"</font><font color="#000000">%&gt;</font><br /><font color="#000000">&lt;%@ page session=</font><font color="#990000">"false" </font><font color="#000000">%&gt;</font><br /><font color="#000000">&lt;%</font><br /><font color="#000000">request.setCharacterEncoding</font><font color="#000000">(</font><font color="#990000">"UTF-8"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#000000">String val = request.getParameter</font><font color="#000000">(</font><font color="#990000">"TEXT"</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#990000">"&gt;&gt;&gt;&gt; The result is " </font><font color="#000000">+ val</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#000000">%&gt;</font></code></td><!-- end source code --></tr></tbody></table></center><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><br /><br />
接着写一个测试类, 主要代码如下:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --><center><table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0"><tbody><tr><!-- start source code --><td align="left" nowrap="nowrap" valign="top"><code><font color="#ffffff">    </font><font color="#0000c0"><b>public static </b></font><font color="#c00000"><b>void </b></font><font color="#000000">main</font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">[] </font><font color="#000000">args</font><font color="#000000">) </font><font color="#0000c0"><b>throws </b></font><font color="#000000">Exception, IOException </font><font color="#000000">{</font><br /><font color="#ffffff">        </font><font color="#000000">String url = </font><font color="#990000">"http://localhost:8080/test.jsp"</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">PostMethod postMethod = </font><font color="#0000c0"><b>new </b></font><font color="#000000">UTF8PostMethod</font><font color="#000000">(</font><font color="#000000">url</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#008000">//填入各个表单域的值</font><br /><font color="#ffffff">        </font><font color="#000000">NameValuePair</font><font color="#000000">[] </font><font color="#000000">data = </font><font color="#000000">{</font><br /><font color="#ffffff">                </font><font color="#0000c0"><b>new </b></font><font color="#000000">NameValuePair</font><font color="#000000">(</font><font color="#990000">"TEXT"</font><font color="#000000">, </font><font color="#990000">"中文"</font><font color="#000000">)</font><font color="#000000">,</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#008000">//将表单的值放入postMethod中</font><br /><font color="#ffffff">        </font><font color="#000000">postMethod.setRequestBody</font><font color="#000000">(</font><font color="#000000">data</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#008000">//执行postMethod</font><br /><font color="#ffffff">        </font><font color="#000000">HttpClient httpClient = </font><font color="#0000c0"><b>new </b></font><font color="#000000">HttpClient</font><font color="#000000">()</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">httpClient.executeMethod</font><font color="#000000">(</font><font color="#000000">postMethod</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">    </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><br /><font color="#ffffff">    </font><font color="#008000">//Inner class for UTF-8 support</font><br /><font color="#ffffff">    </font><font color="#0000c0"><b>public static class </b></font><font color="#000000">UTF8PostMethod </font><font color="#0000c0"><b>extends </b></font><font color="#000000">PostMethod</font><font color="#000000">{</font><br /><font color="#ffffff">        </font><font color="#0000c0"><b>public </b></font><font color="#000000">UTF8PostMethod</font><font color="#000000">(</font><font color="#000000">String url</font><font color="#000000">){</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>super</b></font><font color="#000000">(</font><font color="#000000">url</font><font color="#000000">)</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff">        </font><font color="#000000">@Override</font><br /><font color="#ffffff">        </font><font color="#0000c0"><b>public </b></font><font color="#000000">String getRequestCharSet</font><font color="#000000">() {</font><br /><font color="#ffffff">            </font><font color="#008000">//return super.getRequestCharSet();</font><br /><font color="#ffffff">            </font><font color="#0000c0"><b>return </b></font><font color="#990000">"UTF-8"</font><font color="#000000">;</font><br /><font color="#ffffff">        </font><font color="#000000">}</font><br /><font color="#ffffff">    </font><font color="#000000">}</font></code></td><!-- end source code --></tr></tbody></table></center><!-- =       END of automatically generated HTML code       = --><!-- ======================================================== --><br /><br />
运行这个测试程序, 在 Tomcat 的后台输出中可以正确打印出 "&gt;&gt;&gt;&gt; The result is 中文" .<br /><br /><h3>代码下载</h3>本文所提到的所有代码, 以及测试程序(可直接导入 eclipse)提供打包下载: <a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/httpClientUTF8.tar.bz2?action=action_view_attachment&amp;attachment=HttpClient+POST+%E7%9A%84+UTF-8+%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98.httpClientUTF8.tar.bz2">att:HttpClient POST 的 UTF-8 编码问题.httpClientUTF8.tar.bz2</a><br /><br /><h3>END</h3><br /><img src ="http://www.blogjava.net/thinkbase/aggbug/78376.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-10-31 23:00 <a href="http://www.blogjava.net/thinkbase/archive/2006/10/31/HttpClientPOST_UTF8.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 实验: 使用 Apache 反向代理实现负载均衡及热备</title><link>http://www.blogjava.net/thinkbase/archive/2006/10/10/74276.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Tue, 10 Oct 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/10/10/74276.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/74276.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/10/10/74276.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/74276.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/74276.html</trackback:ping><description><![CDATA[原文来自:  
                 
                  
                  
                    <a href="http://thinkbase.net/w/main/Wiki?%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87" onmouseover="this.T_TITLE='Edit'; return escape('&lt;span class=\'changeTooltip\'&gt;使用 Apache 反向代理实现负载均衡及热备&lt;/span&gt;')">
                      使用 Apache 反向代理实现负载均衡及热备</a><br /><hr size="2" width="100%" /><br /><h3>初步设想</h3><ul><li>早些时候在 JavaEye 上看到过一些使用 lighttpd 或者 apache 作前端, 通过负载均衡, 实现高性能的 Web 系统的讨论, 于是留意了一下这方面的技术;</li><li>考虑到对不同的 App Server 而言, 实现 Session 复制的配置各不相同(通常是需要配置集群), 因此从通用的角度, 觉得使用 session sticky 方式实现的负载均衡比较方便;</li><li>由于没有看到有资料说 lighttpd 能够实现 session sticky, 所以决定先使用 Apache 试试.</li></ul>
参考资料:<ul><li>JavaEye 上的一篇短文: <a href="http://thinkbase.net/w/main/Wiki?%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87-ref001-from_JavaEye">请教apache跟tomcat做集群session不同步问题</a></li><li>Apache 2.2 HTTP Server 文档中的 mod_proxy 部分: <a href="http://thinkbase.net/w/main/Wiki?%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87-ref002-mod_proxy">英文</a>, <a href="http://thinkbase.net/w/main/Wiki?%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87-ref003-mod_proxy">中文翻译</a></li></ul><h3>环境准备</h3><ul><li>下载安装 Apache, 测试时使用的是 XAMPP ( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.apachefriends.org/en/xampp.html">http://www.apachefriends.org/en/xampp.html</a> ) 的 Linux 版本 (xampp-linux-1.5.4.tar.gz), 按照安装说明, 解压到 /opt/lampp 目录下就可以使用了;
<ul><li>启动 Apache: <code>sudo /opt/lampp/lampp startapache</code></li><li>重新加载 Apache: <code>sudo /opt/lampp/lampp reloadapache</code> (在 httpd.conf 文件被修改后可以不重启, 而是直接 reload 就可以了)</li><li>停止服务: <code>sudo /opt/lampp/lampp stop</code></li></ul></li><li>准备两个运行同样程序的 Web 服务器, 这里使用的是 Tomcat 5.5, 并使用一个 jsp 文件作为测试文件(相关源代码参见文章最后的附件);
<ul><li>这两个 Tomcat 服务器需要将 HTTP 服务配置在不同的端口上, 同时由于测试时运行在同一台机器上, 其它端口也需要避免冲突;</li></ul></li><li>下载安装 JMeter ( jakarta-jmeter-2.2), 用于压力测试, 验证负载均衡的效果;   </li></ul><h3>测试 jsp 文件的说明</h3>测试用的 jsp 文件 (test.jsp) 具有如下功能:<ul><li>显示当前运行的服务器的 IP 地址及端口号, 这样从返回的页面就能够知道是运行在哪一个 Web 服务器上的了;</li><li>统计每个客户端(不同的 session)向同一台服务器发出请求的次数, 通过这个计数可以验证是否实现了 session sticky;</li><li>通过 clear 请求参数(即 .../test.jsp?clear=1)清除请求次数的计数结果, 以便进行下一次测试;</li><li>模拟 JSESSIONID +jvmRoute 的机制, 自行实现了一个 STICK_PORT_TOKEN 的 Cookie, 直接使用不同服务器的 HTTP 端口号作为 route;
<ul><li><strong>说明1</strong>: 考虑到方案的通用性, 这里没有直接使用 JSESSIONID +jvmRoute 的机制;</li><li><strong>说明2</strong>: 虽然作为一个例子, 相关代码是写死在 jsp 文件中的, 但是这个机制可以很方便的用一个 Filter 统一实现;</li></ul></li></ul><h3>Apache 的配置</h3>编辑 Apache 的 httpd.conf 文件(如果使用 xampp-linux 的话, 应该在 /opt/lampp/etc 目录下), 在文件的最后加上如下内容:<br /><pre>###############################################################################<br /># Reverse Proxy and Load Balance ##############################################<br />###############################################################################<br /># 1)简单的反向代理<br />ProxyRequests Off<br />&lt;Proxy *&gt;<br />    Order deny,allow<br />    Allow from all<br />&lt;/Proxy&gt;<br />ProxyPass /1 http://localhost:8080/test<br />#ProxyPassReverse /1 http://localhost:8080/test<br />ProxyPass /2 http://localhost:18080/test<br />#ProxyPassReverse /2 http://localhost:18080/test<br /># 2)非 stickysession 的 balance<br />ProxyPass /3 balancer://non-sticky-cluster nofailover=On<br />&lt;Proxy balancer://non-sticky-cluster&gt;<br />    BalancerMember http://localhost:8080/test<br />    BalancerMember http://localhost:18080/test smax=10<br />&lt;/Proxy&gt;<br /># 3)stickysession 的 balance<br />ProxyPass /4 balancer://sticky-cluster stickysession=STICK_PORT_TOKEN nofailover=On<br />&lt;Proxy balancer://sticky-cluster&gt;<br />    BalancerMember http://localhost:8080/test route=8080<br />    BalancerMember http://localhost:18080/test route=18080 loadfactor=2<br />&lt;/Proxy&gt;</pre>
这个配置分为3个部分, 包括了 1)简单的反向代理, 2)非 session sticky 的 load balance, 以及
3)session sticky 的 load balance 三种方式的配置(这里假设两个 Tomcat 服务器的 HTTP 服务被配置在
8080 和 18080 端口), 其中第 2) 和 3) 的配置中 "nofailover=On" 适合于没有 session
复制的情况下, 这种情况下, 如果其中一台 HTTP 服务器出错, 那么原来分配在这个出错机器上的浏览器客户端不会被自动转移到另外的服务器上,
必须重新启动浏览器才能将请求分配到另外一台服务器上去.<br /><br /><h3>使用 JMeter 测试结果</h3>使用 JMeter 对 "3)session sticky 的 load balance" 的效果进行测试, 通过压力测试的方式, 检查两台 Tomcat 服务器被分配到的请求数量, 相关的测试脚本参见文章最后的附件.<br /><br />
注意如果重复测试, 在下一次测试开始之前请对每个 Tomcat 服务器执行 .../test.jsp?clear=1 的请求, 清除上一次的计数结果.<br /><br />
从下图的测试结果可见: 50个线程中有21个被分配在 8080 端口的服务器上, 29个则被分配到 18080 端口的服务器; 另外, 所有的 session 请求次数都是 20 次, 说明 session sticky 达到了预期的效果.<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87.8080.png" /></li><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87.18080.png" /></li></ul><hr /><h3>附件</h3><ul><li>测试用的 jsp 文件: <a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/test.jsp?action=action_view_attachment&amp;attachment=%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87.test.jsp">att:使用 Apache 反向代理实现负载均衡及热备.test.jsp</a></li><li>JMeter 测试脚本: <a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/load-test.jmx?action=action_view_attachment&amp;attachment=%E4%BD%BF%E7%94%A8+Apache+%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%AE%9E%E7%8E%B0%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%8F%8A%E7%83%AD%E5%A4%87.load-test.jmx">att:使用 Apache 反向代理实现负载均衡及热备.load-test.jmx</a></li></ul><hr /><h3>后记</h3>如何禁用 XAMPP 自带的内容, 使之成为一个单纯的转发服务器:<ul><li>1)注释掉 /opt/lampp/etc/httpd.conf 中 "Include etc/extra/httpd-xampp.conf" 这一行;</li><li>2)删除或者移走 /opt/lampp/htdocs 目录下的内容(但是此目录需要保留).</li></ul><img src ="http://www.blogjava.net/thinkbase/aggbug/74276.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-10-10 13:12 <a href="http://www.blogjava.net/thinkbase/archive/2006/10/10/74276.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍一个 RSA 加密小工具 bmrsa</title><link>http://www.blogjava.net/thinkbase/archive/2006/07/29/RSA_With_bmrsa.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Fri, 28 Jul 2006 16:18:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/07/29/RSA_With_bmrsa.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/60675.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/07/29/RSA_With_bmrsa.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/60675.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/60675.html</trackback:ping><description><![CDATA[
		<p>(原文来自: <span class="pageHeader"></span><a href="http://thinkbase.net/w/main/Wiki?action=action_search&amp;text=%222006-07-28+%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AA+RSA+%E5%8A%A0%E5%AF%86%E5%B0%8F%E5%B7%A5%E5%85%B7+bmrsa%22">
              
                
                
                  2006-07-28 介绍一个 RSA 加密小工具 bmrsa</a>)<br /></p>
		<p>因为要做一个不对称加密/解密相关的应用(其实是想用在软件的注册控制方面), 本来的想法是去找找有没有 RSA
加密/解密的源代码的例子, 结果在 sourceforge 找到来 bmrsa(RSA Cryptographic Text
Processor), 可以从 <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://sourceforge.net/projects/bmrsa">http://sourceforge.net/projects/bmrsa</a> 访问.<br /><br />
项目 README 里的描述:<br /></p>
		<pre> This program is an exercise in prime number generation,<br /> RSA key generation, RSA encryption and conversion between<br /> decimal, hexadecimal, base64 and text.  Take note that RSA<br /> is generally not used to encrypt entire messages because it<br /> is too slow.  It is normally used to encrypt keys used in<br /> other encryption algorithms or other relatively small<br /> values.  For more detailed documentation, execute bmrsa<br /> from a command line without passing any arguments.  You will<br /> probably want to pipe the output through more like this</pre>
		<br />
试用了一下, 总结该软件有如下特点:<ul><li>开源, GPL 协议;</li><li>跨平台, 而且完全使用 C++ 编写, 下载包里包含了 Windows 和 Linux 下的可执行文件;</li><li>命令行程序, 运行时使用 stdin 和 stdout, 应该说被其它程序调用还算方便;</li><li>只能处理文本, 不支持中文, 因此对于中文文本或者二进制文件可能需要先 base64 一下.</li></ul><br />
我用的是 2003-03-16 16:00 的 bmrsa10.zip 这个包, 可以从项目主页找到下载, 也可以从下面的链接下载:<ul><li><a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/bmrsa10.zip?action=action_view_attachment&amp;attachment=2006-07-28+%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AA+RSA+%E5%8A%A0%E5%AF%86%E5%B0%8F%E5%B7%A5%E5%85%B7+bmrsa.bmrsa10.zip">att:2006-07-28 介绍一个 RSA 加密小工具 bmrsa.bmrsa10.zip</a></li><li>(Size: 93697, MD5: 18be60ae46369f411a36aa41c8776253)</li></ul><br />
下面简单说明产生 公钥/私钥 和 加密/解密 的整个过程:<ul><li>首先将下载后的 bmrsa10.zip 解压缩到一个目录, 进入这个目录;</li><li>如果是 linux 环境下, 为了后面输入命令方便, 可以执行 <code> export PATH=.:$PATH </code>, 将当前目录加入 PATH;</li><li>首先生成一个 768 位的密钥文件 <strong>_keys.768-bit.txt</strong>:</li></ul><pre>bmrsa -mkh -g 48 -f _keys.768-bit.txt</pre><ul><li>接走我们建立另外两个文本文件 <strong>_private-key.768-bit.txt</strong> 和 <strong>_public-key.768-bit.txt</strong>, 分别对应私钥和公钥. 这两个文件都是对 <strong>_keys.768-bit.txt</strong> 中内容的裁减, 基本上类似这个样子:
<ul><li><strong>_private-key.768-bit.txt</strong></li></ul></li></ul><pre>public mod=7ECF58B12DAB4557B9B39589D26CA444BDF96...<br />private key=3C4B0676352943057A3B6B0D54A8B0E56265B...<br />private p=ED66018402DEED19082ED5EA500B778DAFA7A0...<br />private q=88BF09780DC8C15C429AE72AC6F91B0795C4E68...</pre><ul><li>和:
<ul><li><strong>_public-key.768-bit.txt</strong></li></ul></li></ul><pre>public mod=7ECF58B12DAB4557B9B39589D26CA444BDF96...<br />public key=BA562B6FEF44681C8937C54FCB985B205DAF0A...</pre><ul><li>在实际使用中, 我们可以把公钥公布出来, 而用私钥加密传递的信息, 接收到信息的人可以使用公钥对信息进行解密(另外也可以反过来使用公钥加密, 接收方使用私钥解密);
<ul><li>具体到这个例子中, 也就是说我们可以把 <strong>_public-key.768-bit.txt</strong> 公开给需要接收我们的信息的人, 而 <strong>_private-key.768-bit.txt</strong> 必需妥善保管, 因为一旦别人拿到这个私钥, 那就意味着他可以冒充你发送消息了;</li></ul></li><li>下面我们建立一个文本文件 <strong>_demo.txt</strong> 作为加密的原文:</li></ul><pre>NAME=thinkbase<br />URL =http://www.thinkbase.net<br />IP  =218.81.120.31</pre><ul><li>我们使用密钥 <strong>_private-key.768-bit.txt</strong> 对 <strong>_demo.txt</strong> 进行加密, 加密后的文件是 <strong>_demo.enc.txt</strong></li></ul><pre>bmrsa -mkh -mit -moh -pr -f _private-key.768-bit.txt &lt;_demo.txt &gt;_demo.enc.txt</pre><ul><li>接收方拿到加密后的文件 <strong>_demo.enc.txt</strong> 后, 可以使用公钥 <strong>_public-key.768-bit.txt</strong> 对信息进行解密:</li></ul><pre>bmrsa -mkh -mih -mot -pu -f _public-key.768-bit.txt &lt;_demo.enc.txt<br /><br /></pre>
具体的运行界面参见下图:<br /><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-07-28+%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AA+RSA+%E5%8A%A0%E5%AF%86%E5%B0%8F%E5%B7%A5%E5%85%B7+bmrsa.bmrsa10-1.png" /><br /><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-07-28+%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AA+RSA+%E5%8A%A0%E5%AF%86%E5%B0%8F%E5%B7%A5%E5%85%B7+bmrsa.bmrsa10-2.png" /><br /><br /><hr />
在实验过程中使用的一些文件也可以下载, 供参考:<ul><li><a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/bmrsa10-test.tar.gz?action=action_view_attachment&amp;attachment=2006-07-28+%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%AA+RSA+%E5%8A%A0%E5%AF%86%E5%B0%8F%E5%B7%A5%E5%85%B7+bmrsa.bmrsa10-test.tar.gz">att:2006-07-28 介绍一个 RSA 加密小工具 bmrsa.bmrsa10-test.tar.gz</a></li></ul><img src ="http://www.blogjava.net/thinkbase/aggbug/60675.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-07-29 00:18 <a href="http://www.blogjava.net/thinkbase/archive/2006/07/29/RSA_With_bmrsa.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>尝试了一下用 swig 编写 JNI 程序</title><link>http://www.blogjava.net/thinkbase/archive/2006/07/29/JNI_With_SWIG.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Fri, 28 Jul 2006 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/07/29/JNI_With_SWIG.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/60674.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/07/29/JNI_With_SWIG.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/60674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/60674.html</trackback:ping><description><![CDATA[
		<p>(原文来自: <span class="pageHeader"></span><a href="http://thinkbase.net/w/main/Wiki?action=action_search&amp;text=%222006-06-18+%E5%B0%9D%E8%AF%95%E4%BA%86%E4%B8%80%E4%B8%8B%E7%94%A8+swig+%E7%BC%96%E5%86%99+JNI+%E7%A8%8B%E5%BA%8F%22">
              
                
                
                  2006-06-18 尝试了一下用 swig 编写 JNI 程序</a>)<br /></p>
		<p>
          总是觉得编写 JNI (Java Native Interface) 程序是件复杂的事情, 于是开始漫无目的地搜索是否有简单一点的方法, 倒是有些商业软件提供这样的功能, 比如 <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.jniwrapper.com/">http://www.jniwrapper.com</a> 就提供了通过 Java 直接调用 DLL 的功能(可惜是商业软件, 哈哈).<br /><br />
搜索中无意到了 swig 的网站( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.swig.org/">http://www.swig.org</a> ), 看到一个用 swig 产生 Java 模块的例子(原来知道 swig 是因为 python 的缘故), 于是就照着例子自己尝试了一下(比例子稍微复杂一点, 另外我是用 mingw 上的 gcc 进行编译的).<br /><br />
源代码包括 3 个文件, <code>Example.c, Example.i, net/thinkbase/test/Test.java</code>:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p>
		<center>
				<table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td align="left" nowrap="nowrap" valign="top">
												<code>
														<font color="#008000">/** Example.c ****************************************************************/</font>
														<br />
														<font color="#000000">#include &lt;time.h&gt;</font>
														<br />
														<br />
														<font color="#008000">/**A variable*/</font>
														<br />
														<font color="#c00000">
																<b>double </b>
														</font>
														<font color="#000000">PI = </font>
														<font color="#990000">3.1415927</font>
														<font color="#000000">;</font>
														<br />
														<br />
														<font color="#008000">/**Return n!*/</font>
														<br />
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">fact</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">n</font>
														<font color="#000000">) {</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>if </b>
														</font>
														<font color="#000000">(</font>
														<font color="#000000">n &lt;= </font>
														<font color="#990000">1</font>
														<font color="#000000">)</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#0000c0">
																<b>return </b>
														</font>
														<font color="#990000">1</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>else</b>
														</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#0000c0">
																<b>return </b>
														</font>
														<font color="#000000">n*fact</font>
														<font color="#000000">(</font>
														<font color="#000000">n-</font>
														<font color="#990000">1</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">}</font>
														<br />
														<br />
														<font color="#008000">/**mod function*/</font>
														<br />
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">mod</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">x, </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">y</font>
														<font color="#000000">) {</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>return </b>
														</font>
														<font color="#000000">(</font>
														<font color="#000000">x%y</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">}</font>
														<br />
														<br />
														<font color="#008000">/**Get time as String*/</font>
														<br />
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* getTime</font>
														<font color="#000000">(){</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">time_t ltime;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">time</font>
														<font color="#000000">(</font>
														<font color="#000000">&amp;ltime</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>return </b>
														</font>
														<font color="#000000">ctime</font>
														<font color="#000000">(</font>
														<font color="#000000">&amp;ltime</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">}</font>
														<br />
														<br />
														<font color="#008000">/**to upper case*/</font>
														<br />
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* toUpperCase</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* result</font>
														<font color="#000000">){</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* p = result;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>while</b>
														</font>
														<font color="#000000">(</font>
														<font color="#990000">'\0'</font>
														<font color="#000000">!=*p</font>
														<font color="#000000">){</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">c = *p;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#0000c0">
																<b>if </b>
														</font>
														<font color="#000000">( (</font>
														<font color="#000000">c &gt; </font>
														<font color="#990000">'a'</font>
														<font color="#000000">)</font>
														<font color="#000000">&amp;&amp;</font>
														<font color="#000000">(</font>
														<font color="#000000">c &lt; </font>
														<font color="#990000">'x'</font>
														<font color="#000000">) ){</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">*p = c-</font>
														<font color="#990000">32</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">}</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">p++;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">}</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>return </b>
														</font>
														<font color="#000000">result;</font>
														<br />
														<font color="#000000">}</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</center>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<br />
		<br />
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<center>
				<table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td align="left" nowrap="nowrap" valign="top">
												<code>
														<font color="#008000">/** Example.i ****************************************************************/</font>
														<br />
														<font color="#000000">%module Example</font>
														<br />
														<font color="#000000">%</font>
														<font color="#000000">{</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#008000">/* Put header files here or function declarations like below */</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>double </b>
														</font>
														<font color="#000000">PI;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">fact</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">n</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">mod</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">x, </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">y</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* getTime</font>
														<font color="#000000">()</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* toUpperCase</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* str</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">%</font>
														<font color="#000000">}</font>
														<br />
														<br />
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>double </b>
														</font>
														<font color="#000000">PI;</font>
														<br />
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">fact</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">n</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">mod</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">x, </font>
														<font color="#c00000">
																<b>int </b>
														</font>
														<font color="#000000">y</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* getTime</font>
														<font color="#000000">()</font>
														<font color="#000000">;</font>
														<br />
														<font color="#000000">extern </font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* toUpperCase</font>
														<font color="#000000">(</font>
														<font color="#c00000">
																<b>char </b>
														</font>
														<font color="#000000">* str</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</center>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<br />
		<br />
		<!-- ======================================================== -->
		<!-- = Java Sourcecode to HTML automatically converted code = -->
		<!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = -->
		<!-- =     Further information: http://www.java2html.de     = -->
		<center>
				<table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td align="left" nowrap="nowrap" valign="top">
												<code>
														<font color="#008000">/** net/thinkbase/test/Test.java *********************************************/</font>
														<br />
														<font color="#0000c0">
																<b>package </b>
														</font>
														<font color="#000000">net.thinkbase.test;</font>
														<br />
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">net.thinkbase.test.swig.Example;</font>
														<br />
														<br />
														<font color="#0000c0">
																<b>public class </b>
														</font>
														<font color="#000000">Test </font>
														<font color="#000000">{</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#0000c0">
																<b>public static </b>
														</font>
														<font color="#c00000">
																<b>void </b>
														</font>
														<font color="#000000">main</font>
														<font color="#000000">(</font>
														<font color="#000000">String argv</font>
														<font color="#000000">[]) {</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.loadLibrary</font>
														<font color="#000000">(</font>
														<font color="#990000">"Example"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.out.println</font>
														<font color="#000000">(</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#990000">"    Example.getPI()      = " </font>
														<font color="#000000">+ Example.getPI</font>
														<font color="#000000">())</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.out.println</font>
														<font color="#000000">(</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#990000">"    Example.fact(6)      = " </font>
														<font color="#000000">+ Example.fact</font>
														<font color="#000000">(</font>
														<font color="#990000">6</font>
														<font color="#000000">))</font>
														<font color="#000000">;</font>
														<br />
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.loadLibrary</font>
														<font color="#000000">(</font>
														<font color="#990000">"Example"</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.out.println</font>
														<font color="#000000">(</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#990000">"    Example.mod(100, 30) = " </font>
														<font color="#000000">+ Example.mod</font>
														<font color="#000000">(</font>
														<font color="#990000">100</font>
														<font color="#000000">, </font>
														<font color="#990000">30</font>
														<font color="#000000">))</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.out.println</font>
														<font color="#000000">(</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#990000">"    Example.getTime()    = " </font>
														<font color="#000000">+ Example.getTime</font>
														<font color="#000000">())</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">System.out.println</font>
														<font color="#000000">(</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#990000">"    Example.toUpperCase(\"Hello, world!\") = " </font>
														<font color="#000000">+</font>
														<br />
														<font color="#ffffff">            </font>
														<font color="#000000">Example.toUpperCase</font>
														<font color="#000000">(</font>
														<font color="#990000">"Hello, world!"</font>
														<font color="#000000">))</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">    </font>
														<font color="#000000">}</font>
														<br />
														<font color="#000000">}</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</center>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<br />
		<hr />
		<br />
		<h3>试验步骤</h3>建立必要的目录:<ul><li><code>mkdir "net/thinkbase/test/swig"</code></li><li><code>mkdir ".out"</code></li></ul>
使用 swig 建立相关接口:<ul><li><code>swig -java -package net.thinkbase.test.swig -outdir net/thinkbase/test/swig Example.i</code></li></ul>
编译 c 文件得到 dll:<ul><li><code>gcc -c Example.c -o .out/Example.o -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32</code></li><li><code>gcc -c Example_wrap.c -o .out/Example_wrap.o -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32</code></li><li><code>gcc -shared .out/Example.o .out/Example_wrap.o -mno-cygwin -Wl,--add-stdcall-alias -o .out/Example.dll</code></li></ul>
编译测试用的 Java 程序:<ul><li><code>javac -sourcepath . net/thinkbase/test/Test.java -d .out</code></li></ul>
运行测试:<ul><li><code>java -cp .out -Djava.library.path=.out net.thinkbase.test.Test</code></li></ul>
运行及测试结果:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-06-18+%E5%B0%9D%E8%AF%95%E4%BA%86%E4%B8%80%E4%B8%8B%E7%94%A8+swig+%E7%BC%96%E5%86%99+JNI+%E7%A8%8B%E5%BA%8F.swig.png" /></li></ul>
源代码可以从这里下载:<ul><li><a class="attachmentlink" target="_blank" href="http://thinkbase.net/w/main/Wiki/swig.zip?action=action_view_attachment&amp;attachment=2006-06-18+%E5%B0%9D%E8%AF%95%E4%BA%86%E4%B8%80%E4%B8%8B%E7%94%A8+swig+%E7%BC%96%E5%86%99+JNI+%E7%A8%8B%E5%BA%8F.swig.zip">att:2006-06-18 尝试了一下用 swig 编写 JNI 程序.swig.zip</a></li></ul><img src ="http://www.blogjava.net/thinkbase/aggbug/60674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-07-29 00:16 <a href="http://www.blogjava.net/thinkbase/archive/2006/07/29/JNI_With_SWIG.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSL 证书的快速建立和Tomcat 双向 SSL 配置实例</title><link>http://www.blogjava.net/thinkbase/archive/2006/06/15/52873.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Wed, 14 Jun 2006 16:16:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/06/15/52873.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/52873.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/06/15/52873.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/52873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/52873.html</trackback:ping><description><![CDATA[一个方便的SSL证书配置工具的介绍, 以及Tomcat上配置双向SSL(就是必须要客户端数字证书才能访问)的具体例子; 文章的主要内容完成于一年半以前, 现在发表基本上算是炒冷饭了, 不过最近加上了 Tomcat 5 和 Tomcat 4 上的实际配置例子, 所以整理了一下重新发出来.<br /><br /><p><a target="" class="" title="配置适用于正式使用环境下的Tomcat Web服务器双向SSL认证" href="http://thinkbase.net/w/main/Wiki?topic=Tomcat5SSL_ServerAndClient&amp;action=action_printable&amp;depth=0&amp;hideform=true">配置适用于正式使用环境下的Tomcat Web服务器双向SSL认证</a></p><a target="" class="" title="在 Tomcat 5.5 上的配置实例" href="http://thinkbase.net/w/main/Wiki?topic=Tomcat5SSL_ServerAndClient+%E5%9C%A8+Tomcat+5.5+%E4%B8%8A%E7%9A%84%E9%85%8D%E7%BD%AE%E5%AE%9E%E4%BE%8B&amp;action=action_printable&amp;depth=0&amp;hideform=true">在 Tomcat 5.5 上的配置实例</a><br /><a target="" class="" title="在 Tomcat 4.1.31 上的配置实例" href="http://thinkbase.net/w/main/Wiki?topic=Tomcat5SSL_ServerAndClient+%E5%9C%A8+Tomcat+4.1.31+%E4%B8%8A%E7%9A%84%E9%85%8D%E7%BD%AE%E5%AE%9E%E4%BE%8B&amp;action=action_printable&amp;depth=0&amp;hideform=true">在 Tomcat 4.1.31 上的配置实例</a><br /><img src ="http://www.blogjava.net/thinkbase/aggbug/52873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-06-15 00:16 <a href="http://www.blogjava.net/thinkbase/archive/2006/06/15/52873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Ubuntu 上面使用的开发工具(Java 开发相关)</title><link>http://www.blogjava.net/thinkbase/archive/2006/06/05/50384.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Sun, 04 Jun 2006 16:41:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/06/05/50384.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/50384.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/06/05/50384.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/50384.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/50384.html</trackback:ping><description><![CDATA[
		<div align="right">
				<font color="#000000">
						<i>(如果看不到图请点击标题进入)</i>
				</font>
				<br />
				<font size="2">类别:
                  <span><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=ubuntu">ubuntu</a><br /></span></font>
				<div align="left">将 Java 开发环境迁移到 Ubuntu 基本完成了, 现在初步有了一个稳定的开发环境:</div>
		</div>
		<span>
		</span>
		<ul>
				<li>Eclipse, 这个不用说了;</li>
				<li>Firefox, 这个也不用说了;</li>
				<li>JFileSync, 很好用的文件同步工具, 我主要用来和 Windows 机器上的某些目录进行文件同步;<br /><a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://jfilesync.sourceforge.net/">http://jfilesync.sourceforge.net/</a></li>
				<li>Meld, 文件比较工具, 大概和 Windows 下的 WinMerge 功能差不多, 不过这个东东是用 Python 写的, 也许在 Windows 下面也能运行;<br /><a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://meld.sourceforge.net/">http://meld.sourceforge.net/</a></li>
				<li>NetBeans, 和 Eclipse 齐名的开源 Java IDE, 偶尔用用;</li>
				<li>SVN Client, 其实就是另外一个 Eclipse(只是 Platform, 不含 JDT), 安装了 subclipse 插件, 换了个图标;</li>
				<li>vmplayer, 可以认为是著名的 VMWare 的简化版, 只能运行, 不能创建虚拟机; 这是唯一一个非开源的软件.</li>
		</ul>
		<img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-31+%E5%9C%A8+Ubuntu+%E4%B8%8A%E9%9D%A2%E4%BD%BF%E7%94%A8%E7%9A%84%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7.dev-tools-in-ubuntu.png" />
		<br />
<img src ="http://www.blogjava.net/thinkbase/aggbug/50384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-06-05 00:41 <a href="http://www.blogjava.net/thinkbase/archive/2006/06/05/50384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Aspirin(阿司匹林) - 简单实现邮件发送功能,不需要SMTP服务器</title><link>http://www.blogjava.net/thinkbase/archive/2006/06/05/50382.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Sun, 04 Jun 2006 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/06/05/50382.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/50382.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/06/05/50382.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/50382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/50382.html</trackback:ping><description><![CDATA[
		<p align="right">
				<font size="2">
                  类别: <span><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=java"></a></span></font>
				<span>
						<a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=java">java</a> | <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=javamail">javamail</a> | <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=mail">mail</a></span>
		</p>
		<p>
          Aspirin(阿司匹林, <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="https://aspirin.dev.java.net/">https://aspirin.dev.java.net/</a> ), 按照网站上的介绍, "Aspirin is an embeddable send-only SMTP server.".<br /><br />
为什么叫阿司匹林呢? 因为它就是用来解决令人头痛的发送邮件问题的.<br /><br />
Aspirin 项目中使用了部分来自 Apache James (Apache 著名的邮件服务器项目, <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://james.apache.org/">http://james.apache.org/</a> )的代码, 通过建立一个小型的 SMTP 服务器, 实现了一个不需要外部 SMTP 服务器的, 简单的 mail 发送工具;<br /><br />
不依赖于外部 SMTP 服务器, 意味着我们在通过 Java 程序发送邮件时, 可以不再需要安装和配置 postfix, sendmail 等 email 服务器, 使应用程序配置更简单, 更方便做到跨平台.<br /><br />
使用 Aspirin 发送邮件的代码很简单, 代码片断如下:<br /><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java to HTML Converter V3.0 2003 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --></p>
		<center>
				<table align="center" bgcolor="#ffffff" border="2" cellpadding="3" cellspacing="0">
						<tbody>
								<tr>
										<!-- start source code -->
										<td align="left" nowrap="nowrap" valign="top">
												<code>
														<font color="#000000">...</font>
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">javax.mail.Message.RecipientType;</font>
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">javax.mail.internet.InternetAddress;</font>
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">javax.mail.internet.MimeMessage;</font>
														<br />
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">org.masukomi.aspirin.core.MailQue;</font>
														<br />
														<font color="#0000c0">
																<b>import </b>
														</font>
														<font color="#000000">org.masukomi.aspirin.core.SimpleMimeMessageGenerator;</font>
														<br />
														<br />
														<font color="#000000">...</font>
														<br />
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">MimeMessage msg = SimpleMimeMessageGenerator.getNewMimeMessage</font>
														<font color="#000000">()</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">msg.setSubject</font>
														<font color="#000000">(</font>
														<font color="#000000">subject</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">msg.setText</font>
														<font color="#000000">(</font>
														<font color="#000000">mailText</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">msg.setFrom</font>
														<font color="#000000">(</font>
														<font color="#0000c0">
																<b>new </b>
														</font>
														<font color="#000000">InternetAddress</font>
														<font color="#000000">(</font>
														<font color="#000000">fromAddress</font>
														<font color="#000000">))</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">msg.setRecipient</font>
														<font color="#000000">(</font>
														<font color="#000000">RecipientType.TO, </font>
														<font color="#0000c0">
																<b>new </b>
														</font>
														<font color="#000000">InternetAddress</font>
														<font color="#000000">(</font>
														<font color="#000000">toAddress</font>
														<font color="#000000">))</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">MailQue.addWatcher</font>
														<font color="#000000">(</font>
														<font color="#0000c0">
																<b>new </b>
														</font>
														<font color="#000000">DefaultWatch</font>
														<font color="#000000">())</font>
														<font color="#000000">;</font>
														<br />
														<font color="#ffffff">        </font>
														<font color="#000000">MailQue.queMail</font>
														<font color="#000000">(</font>
														<font color="#000000">msg</font>
														<font color="#000000">)</font>
														<font color="#000000">;</font>
														<br />
														<br />
														<font color="#000000">...</font>
												</code>
										</td>
										<!-- end source code -->
								</tr>
						</tbody>
				</table>
		</center>
		<!-- =       END of automatically generated HTML code       = -->
		<!-- ======================================================== -->
		<br />
		<br />
另外需要注意的是，邮件其实是首先存放在一个队列里面，然后再发送的，所以如果第一次发送失败（比如 DNS 解析失败），程序还是会进行重试的，所以邮件可能会比实际发送时间晚几分钟（甚至更长）发出；具体重试几次，怎么样算失败，我还没有仔细去研究.<br /><img src ="http://www.blogjava.net/thinkbase/aggbug/50382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-06-05 00:32 <a href="http://www.blogjava.net/thinkbase/archive/2006/06/05/50382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 上利用 subclipse 访问 SVN</title><link>http://www.blogjava.net/thinkbase/archive/2006/05/13/45979.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Sat, 13 May 2006 07:01:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/05/13/45979.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/45979.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/05/13/45979.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/45979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/45979.html</trackback:ping><description><![CDATA[
		<p align="right">
				<font color="#000000">
						<i>
						
								(如果看不到图请点击标题进入)
						
				</i>
				</font>
				<br />
		</p>
		<p align="right">
                  类别标签:
                  <span><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=NTLM">NTLM</a> |
                      
                          <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=subclipse">subclipse</a> | <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=subversion">subversion</a> | <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=ubuntu">ubuntu</a></span></p>
		<p> 一开始使用 subclipse (Eclipse 的 Subversion 插件)不能通过 NTLM 认证访问 SVN 服务器,
始终报告如下图所示的错误(svn: HTTP authorization method 'NTLM' is not supported):</p>
		<ul>
				<li>
						<img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-12+Ubuntu+%E4%B8%8A%E5%88%A9%E7%94%A8+subclipse+%E8%AE%BF%E9%97%AE+SVN.01-Screenshot-%E6%97%A0%E6%B3%95%E9%AA%8C%E8%AF%81+++.png" />
				</li>
		</ul>
今天再看了一下, 在 Eclipse Perferences 中的 SVN 设置中发现不能选择使用 "JavaHL" 作为 SVN
接口(报告的错误是在 java.library.path 中找不到 libsvnjavahl-1.so), 心想不知道使用 JavaHL
是否可以解决 NTLM 认证的这个问题, 应该尝试一下, 上网查了查, 从 <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://packages.ubuntulinux.org/dapper/devel/libsvn-javahl">http://packages.ubuntulinux.org/dapper/devel/libsvn-javahl</a> 找到了 libsvn-javahl 的下载 deb 包 libsvn-javahl_1.3.1-3ubuntu1_i386.deb, 下载完毕后使用<br /><pre>  sudo dpkg -i libsvn-javahl_1.3.1-3ubuntu1_i386.deb</pre>
进行安装, 却被告知依赖的 libsvn0 还没有被安装, 直接用 apt-get install libsvn0 安装后再次使用 dpkg
-i 安装下载的 libsvn-javahl_1.3.1-3ubuntu1_i386.deb, 却被告知 libsvn0 版本不对:<br /><pre>xxx@xxxlinux:~/Desktop$ sudo dpkg -i libsvn-javahl_1.3.1-3ubuntu1_i386.deb<br />选中了曾被取消选择的软件包 libsvn-javahl。<br />(正在读取数据库 ... 系统当前总共安装有 60192 个文件和目录。)<br />正在解压缩 libsvn-javahl (从 libsvn-javahl_1.3.1-3ubuntu1_i386.deb) ...<br />dpkg：依赖关系问题使得 libsvn-javahl 的配置工作不能继续：<br /> libsvn-javahl 依赖于 libsvn0 (= 1.3.1-3ubuntu1)；然而：<br />  系统里的 libsvn0 的版本是 1.2.0-1ubuntu1.<br />dpkg：处理 libsvn-javahl (--install)时出错：<br /> 依赖关系问题 - 仍未被配置<br />在处理时有错误发生：<br /> libsvn-javahl</pre>
于是又从 <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://packages.ubuntulinux.org/dapper/devel/libsvn-javahl">http://packages.ubuntulinux.org/dapper/devel/libsvn-javahl</a>
页面上找到 libsvn-javahl 的依赖库 libsvn0 (= 1.3.1-3ubuntu1) 的 deb 文件,
然后安装时又被告知依赖于其它的模块(未安装或者版本不对), 于是继续使用 apt-get install 安装这些模块, 或者继续在 <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://packages.ubuntulinux.org/dapper/devel/">http://packages.ubuntulinux.org/dapper/devel/</a> 下面各个依赖模块的页面上找到这些下一层的依赖模块的 deb 安装包, 如此循环往复, 花了不少时间, 总算把 JavaHL 安装好了.<br /><br />
然后进入 $JAVA_HOME/jre/lib/i386/client/ 目录, 执行:<br /><pre>  sudo ln -s /usr/lib/jni/libsvnjavahl-1.so libsvnjavahl-1.so</pre>
然后再启动 Eclipse, 进入 SVN 的设置页面, 果然现在可以选择 "JavaHL (JNI)" 方式了:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-12+Ubuntu+%E4%B8%8A%E5%88%A9%E7%94%A8+subclipse+%E8%AE%BF%E9%97%AE+SVN.02-Screenshot-Preferences+-1.png" /></li></ul>
连接到 SVN 服务器测试, 果然现在能够正确弹出输入用户名和密码的对话框了:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-12+Ubuntu+%E4%B8%8A%E5%88%A9%E7%94%A8+subclipse+%E8%AE%BF%E9%97%AE+SVN.03-Screenshot-%E8%BE%93%E5%85%A5%E7%94%A8%E6%88%B7%E5%90%8D%E5%92%8C%E5%AF%86%E7%A0%81+.png" /></li></ul><hr /><br />
终于解决了这个问题, 现在可以将大部分工作都转移到 Ubuntu 上面来啦 :)<img src ="http://www.blogjava.net/thinkbase/aggbug/45979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-05-13 15:01 <a href="http://www.blogjava.net/thinkbase/archive/2006/05/13/45979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>把 Java 开发环境从中文 Windows 迁移到 Ubuntu</title><link>http://www.blogjava.net/thinkbase/archive/2006/05/13/45977.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Sat, 13 May 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/05/13/45977.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/45977.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/05/13/45977.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/45977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/45977.html</trackback:ping><description><![CDATA[
		<div align="right">
				<font color="#000000">
						<i>
						
								(如果看不到图,或者格式混乱,请点击标题进入)
						
				</i>
				</font>
				<br />类别标签:
                  <span><a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=font">font</a> | <a class="tagsItem" href="http://thinkbase.net/w/main/Wiki?TagIndex&amp;tag=ubuntu">ubuntu</a><br /><br /></span></div>
		<p>
				<span>
				</span>
		</p>
		<p>
          首先说一下, 这篇文章主要是针对 Java 开发者的, 如果是做 Windows 开发, 那么基本上没有办法把工作环境移植到 Ubuntu 上的(当然也不能说死, 也许以后可以使用 WINE 试试, 呵呵).<br /><br /></p>
		<h2>1.系统默认编码</h2>
		<br />我们知道在中文 Windows 下一般来说系统的默认编码是 GBK, 从 Java 开发的角度来说,
就是在进行诸如 Java 源代码编译, 文件读写等操作时, 默认使用的编码是 GBK; 而我们参照一般的 Ubuntu 中文安装文档,
可能会建议将默认的语言设置为 zh_CN.UTF-8, 这样会带来一些问题, 比如我在 Windows 使用 Eclipse
时的编辑器的默认编码是 GBK, 但是在 Ubuntu 下面就是 UTF-8, 同样是使用 Eclipse, 在 Windows
下的中文文档到了 Ubuntu 中会产生乱码, 必须手工逐个文档设置属性中的编码为 GBK 才可以正常;
一些测试代码也是以默认编码读取文件的, 这些代码读取出来的文件内容也会包含乱码.<br /><br />
所以, 最好是将系统的默认编码设置为 GBK, 这样和 Windows 下面的开发环境最接近. 设置的方法应该不止一种, 我采用的是编辑 /etc/environment, 改成这个样子:<br /><pre>  LANGUAGE="zh_CN:zh:en_US:en"<br />  GST_ID3_TAG_ENCODING=GBK<br />  LANG=zh_CN.GBK<br />  LC_CTYLE=zh_CN.GBK</pre><h2>2.中文字体</h2><br />Ubuntu 5.10 默认安装后的中文字体不是点阵字体, 因此在小字显示的时候模模糊糊比较难看, 而且, 在浏览网页时, 无法显示中文粗体. 关于字体美化的文章网上太多了, 有些是采用 Windows 字体来进行的; 最近 "文泉驿"( <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://wqy.sourceforge.net/">http://wqy.sourceforge.net/</a> ) 的开源点阵字体受到很多好评, 而且点阵字体正好合适用于小字的显示, 我用的是最新的 0.7 beta 版(0.6.9 pcf update 3), 按照 <a href="http://thinkbase.net/w/main/Wiki?2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9-ref01">文泉驿点阵宋体安装指南</a>
上的步骤安装, 修改了 xorg.conf, 也执行了 fc-cache -f -v , 安装过程还算顺利, 就是有一点需要注意,
那就是字体一定要放在 /usr/share/fonts/ 的子目录下面, 不然执行 fc-cache 不会起作用的.
安装完毕后需要配置一下系统的默认字体, Firefox 也需要配置一下字体, 效果还是不错的(见下面截图).<br /><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.Screenshot-Page+Info.png" /><br /><br /><h2>3.Java(Swing)程序的字体</h2><br />这个我主要参考了 <a href="http://thinkbase.net/w/main/Wiki?2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9-ref02">最简单的对JDK1.5的中文乱码处理方法</a> , 按照其中更简单的那个方法, 在 $JAVA_HOME/jre/lib/fonts/ 目录下创建 fallback 目录, 并把一个中文的 TTF 字体链接或者安装到 fallback 目录下就可以了.<br /><br />
和参考文章说的稍有差别, 我是下载了文泉驿 0.6.9 ttf update 3 的 TTF 字体, 直接解压后复制到 fallback
目录下, 接着执行 mkfontdir 和 mkfontscale, 果然问题得以解决; 现在 NetBeans 或者 JMeter 的
"打开" 文件对话框中的按钮和标签就正确显示出中文了.<br /><br /><strong>安装在 Ubuntu 上面的 NetBeans 5.0</strong>:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.Screenshot-Starting+NetBeans+IDE.png" /></li></ul><strong>存在中文问题的"打开项目"对话框</strong>:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.Screenshot-Open+Project.png" /></li></ul><strong>经过处理后可以正确显示中文的对话框</strong>:<ul><li><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9.Screenshot-Open+Project-1.png" /></li></ul><hr />
参考:<ul><li>文泉驿点阵宋体安装指南: <a href="http://thinkbase.net/w/main/Wiki?2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9-ref01">2006-05-11 从中文 Windows 迁移到 Ubuntu 时中文方面的注意事项-ref01</a></li><li>最简单的对JDK1.5的中文乱码处理方法: <a href="http://thinkbase.net/w/main/Wiki?2006-05-11+%E4%BB%8E%E4%B8%AD%E6%96%87+Windows+%E8%BF%81%E7%A7%BB%E5%88%B0+Ubuntu+%E6%97%B6%E4%B8%AD%E6%96%87%E6%96%B9%E9%9D%A2%E7%9A%84%E6%B3%A8%E6%84%8F%E4%BA%8B%E9%A1%B9-ref02">2006-05-11 从中文 Windows 迁移到 Ubuntu 时中文方面的注意事项-ref02</a></li></ul><img src ="http://www.blogjava.net/thinkbase/aggbug/45977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-05-13 14:53 <a href="http://www.blogjava.net/thinkbase/archive/2006/05/13/45977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 Qemu 上面安装 Ubuntu</title><link>http://www.blogjava.net/thinkbase/archive/2006/05/13/45974.html</link><dc:creator>thinkbase.net</dc:creator><author>thinkbase.net</author><pubDate>Sat, 13 May 2006 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/thinkbase/archive/2006/05/13/45974.html</guid><wfw:comment>http://www.blogjava.net/thinkbase/comments/45974.html</wfw:comment><comments>http://www.blogjava.net/thinkbase/archive/2006/05/13/45974.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/thinkbase/comments/commentRss/45974.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/thinkbase/services/trackbacks/45974.html</trackback:ping><description><![CDATA[
		<pre>.<br />    Ubuntu，源于非洲祖鲁人和科萨人的语言，发作“oo-boon-too”的音。学会这个发音还是<br />有价值的，你不是第一个人问这个问题了。<br />    大多数的美国人读"ubuntu"时，将"u"作为元音发音，类似单词 "who" 或者 "boo"，重<br />音在第二个音节即u'buntu，oo-boon-too。如果你喜欢添加一些非洲撒哈拉的味道，你可以在<br />第一个"u"，后面带些嗡嗡声：oom-boon-too。<br />.</pre>
(摘自 <strong>Ubuntu中文</strong> 的 FAQ: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.ubuntu.org.cn/support/documentation/faq/faqsection_view?section=Ubuntu">http://www.ubuntu.org.cn/support/documentation/faq/faqsection_view?section=Ubuntu</a> )<br /><br />
关于 Ubuntu 的详细信息, 可以去看看这两个网站:<ul><li>Ubuntu 中文: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.ubuntu.org.cn/">http://www.ubuntu.org.cn/</a></li><li>Ubuntu 官方站点: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.ubuntulinux.org/">http://www.ubuntulinux.org/</a></li></ul><hr />
Qemu 是一个开源的 CPU 仿真器, 一般介绍都认为它比 Bochs 快(当然比不上 VMWare 啦), 试用一段时间后,
觉得速度还是慢, 不过倒是比较方便, Qemu 的所有配置都是在命令行上输入的, 因此也就没有什么配置文件了, 也不需要安装过程,
解压缩后就可以使用了.<br /><br />
关于 Qemu, 可以看看如下链接:<ul><li>Qemu 官方网站: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://fabrice.bellard.free.fr/qemu/">http://fabrice.bellard.free.fr/qemu/</a></li><li>QEMU on Windows: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.h7.dion.ne.jp/%7Eqemu-win/">http://www.h7.dion.ne.jp/~qemu-win/</a></li><li>QEMU Manager, 一个还是有用的 Qemu UI 程序: <a style="border-bottom-width: 1px; border-bottom-style: dotted;" class="externallink" href="http://www.davereyn.co.uk/">http://www.davereyn.co.uk/</a></li></ul><hr />
言归正传, 说说在 Qemu 上安装 Ubuntu 5.10 的经历, 原先安装了两次都没有成功, 报告磁盘是只读的什么,
后来想想安装时候都是指定在一个 2GB 的 Qemu 模拟硬盘上的, 估计是磁盘空间还是不够, 所以这次用了一个 4GB 的模拟硬盘,
大概花了一个下午安装才完成, 果然需要大于 2G 的空间. 闲话少说, 给几张图片 :)<br /><br /><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2005-11-06+Ubuntu+%E5%92%8C+Qemu.qemu01.png" /><br /><br /><img src="http://thinkbase.net/w/main/Wiki?action=action_view_attachment&amp;attachment=2005-11-06+Ubuntu+%E5%92%8C+Qemu.qemu02.png" /><br /><img src ="http://www.blogjava.net/thinkbase/aggbug/45974.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/thinkbase/" target="_blank">thinkbase.net</a> 2006-05-13 14:38 <a href="http://www.blogjava.net/thinkbase/archive/2006/05/13/45974.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>