﻿<?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-我的Blog我做主^_^-文章分类-JAVA</title><link>http://www.blogjava.net/wyz191/category/19203.html</link><description>走向一条通往JAVA的不归路...</description><language>zh-cn</language><lastBuildDate>Thu, 22 Mar 2007 10:16:28 GMT</lastBuildDate><pubDate>Thu, 22 Mar 2007 10:16:28 GMT</pubDate><ttl>60</ttl><item><title>Java中日期的使用方法</title><link>http://www.blogjava.net/wyz191/articles/105161.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Wed, 21 Mar 2007 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/105161.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/105161.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/105161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/105161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/105161.html</trackback:ping><description><![CDATA[Java中处理日期的类主要有Date、Calendar和DateFormat三个，在JDK中它们对应的包的位置和相关的派生类如下所示： <br />1、 Date：具体类java.util.Date ； <br />2、 Calendar:抽象类java.text.DateFormat,它派生的一个子类为java.text.SimpleDateFormat <br />3、 DateFormat:抽象类java.util.Calendar，它派生的一个子类为java.util.GregorianCalendar <br />（注：如果有朋友对具体类和抽象类不了解，可以参考相关Java资料） <br /><br />现在对以上三个类进行如下分析： <br /><br />一、对Date类的分析 <br /><br />Date 类从JDK 1.0开始进化， 当时它只包含了几个简单的处理日期数据的方法。 由于这些方法实用性差，现在基本上被Calendar类中各方法所代替了。这种改进目的是为了更好的处理日期数据国际化格式。 Date 类实际上只是一个包裹类, 它包含一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数. <br /><br />为了加深对Date类的理解，列举如下一个简单例子来说明Date的使用： <br />import java.util.Date; <br />public class DateTest1 { <br />public static void main(String[] args) { <br />/** Get the system Date **/ <br />Date date = new Date(); <br />System.out.println(date.getTime()); <br />} <br />} <br />系统输出如下结果： <br />1001803809710 <br /><br />在这个例子中,值得我们注意的是我们使用了Date 构造函数创建一个日期对象, 在没有任何参数的情况下，这个构造函数会自动调用System.currentTimeMillis() 方法来获取当前系统日期.。 <br /><br /><br />二、对DateFormat类的分析 <br /><br />如果我们希望定制日期数据的格式, 比如显示的日期格式为：2006年06月23日，抽象类java.util.Calendar和它的子类java.util.GregorianCalendar能完成这一功能。 <br />下面的例子展示了如何完成这个工作: <br />import java.util.SimpleDateFormat; <br />import java.util.Date; <br />public class DateTest2 { <br />public static void main(String[] args) { <br /><br />SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日",Locale.US); <br />Date date = new Date(); <br />System.out.println(bartDateFormat.format(date)); <br />} <br />} <br /><br />只要通过向SimpleDateFormat 的构造函数传递格式字符串" yyyy年MM月dd日", 我们就可以指明自己想要的格式. 其中yyyy是年，MM是月, dd是日. 字符的个数决定了日期是如何格式化的，如果格式为"yyyy年MM月dd日"就会显示 06年06月23日；如果是"yy-MM-dd"就显示06-06-23。 <br /><br />三、对Calendar 类的分析 <br /><br />如果想设置、获取、操纵一个日期对象的各个特定部分，比如获得小时, 日, 分钟、计算一个月的某一天说星期几等等。这样的情况就需要抽象类java.util.Calendar和它的子类来处理。为了能清楚地说明问题，列举下面的例子, 它的功能是计算第十个星期五是13号. <br /><br />import java.util.GregorianCalendar; <br />import java.util.Date; <br />import java.text.DateFormat; <br />public class CalendarTest{ <br /><br />public static void main(String[] args) { <br />DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL); <br />GregorianCalendar cal = new GregorianCalendar(); <br /><br />/** Set the date and time of our calendar to the system&amp;s date and time **/ <br />cal.setTime(new Date()); <br />System.out.println("System Date: " + dateFormat.format(cal.getTime())); <br /><br />/** Set the day of week to FRIDAY **/ <br />cal.set(GregorianCalendar.DAY_OF_WEEK, GregorianCalendar.FRIDAY); <br />System.out.println("After Setting Day of Week to Friday: " + <br />dateFormat.format(cal.getTime())); <br /><br />int friday13Counter = 0; <br />while (friday13Counter &lt;= 10) { <br /><br />/** Go to the next Friday by adding 7 days. **/ <br />cal.add(GregorianCalendar.DAY_OF_MONTH, 7); <br /><br />/** If the day of month is 13 we have another Friday the 13th. **/ <br />if (cal.get(GregorianCalendar.DAY_OF_MONTH) == 13) { <br />friday13Counter++; <br />System.out.println(dateFormat.format(cal.getTime())); <br />} <br />} <br />} <br />} <br />输出结果是: <br />System Date: Saturday, September 29, 2005 <br /><br /><br />四、总结 <br /><br />在Java通过一下三个类的使用，一般可以满足各种形式的日期使用。实际上，Java中日期使用的方法还有很多，如果有兴趣的朋友请参考JDK帮助手册。 <br /><a href="http://www.javaresearch.org/article/55424.htm">http://www.javaresearch.org/article/55424.htm</a><img src ="http://www.blogjava.net/wyz191/aggbug/105161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-03-21 09:57 <a href="http://www.blogjava.net/wyz191/articles/105161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC2/3.0的特征点滴 </title><link>http://www.blogjava.net/wyz191/articles/jdbc.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Mon, 05 Feb 2007 06:38:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/jdbc.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/97998.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/jdbc.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/97998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/97998.html</trackback:ping><description><![CDATA[最近写程序已经很少直接用JDBC了，一直都是用ibaits, Hibernate等来招呼，因为现在的集成框架已经很稳定了。不过对JDBC的直接使用还是不可以忽略的，JDBC3.0提供的n多的新特征还是要熟悉了解的，以前学jdbc的时候就是上网找些demo和介绍来学，使用很单一，对JDBC3.0的好多新的特征都忽略了，比如下面一个例子：  <br /><br />Statement stmt = con.createStatement(); <br />ResultSet rs = stmt.executeQuery("SELECT * FROM user WHERE username='aa'"); <br />stmt.executeUpdate("UPDATE user SET lastdatetime=now() where username='aa'");  <br /><br />这是一个用户登录时，经常用到的代码，先是根据用户名aa查找该用户的详细信息，然后再更新该用户的最后登录时间（lastdatetime）。这这个里面，我们用了两个sql语句，这个是我一直用的方法，但是如果用JDBC2.0给我们提供的便利，我们只要写一条sql就够了，其他的都交给jdbc，看下面的代码：  <br /><br />Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br />ResultSet rs2 = stmt.executeQuery("SELECT * FROM user WHERE username='aa'"); <br />rs2.next(); <br />rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis())); <br />rs2.updateRow();  <br /><br />这里面最主要的特征就是ResultSet.TYPE_FORWARD_ONLY和ResultSet.CONCUR_UPDATABLE，通过初始化Statement时传不同的参数，可以对ResultSet进行不用的错作限制。con.createStatement的时候，有三种可以掉用的函数：  <br /><br />1、createStatement(); <br />2、createStatement(int resultSetType, int resultSetConcurrency) <br />3、createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)  <br /><br />其中resultSetType可选值是： <br />   1、ResultSet.TYPE_FORWARD_ONLY  在ResultSet中只能先前移动游标， <br />   2、ResultSet.TYPE_SCROLL_INSENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标， <br />   3、ResultSet.TYPE_SCROLL_SENSITIVE 在ResultSet中可以随心所欲的先前向后移动游标，同时ResultSet的值有所改变的时候，他可以得到改变后的最新的值 <br />其中resultSetConcurrency可选值是： <br />   1、ResultSet.CONCUR_READ_ONLY  在ResultSet中的数据记录是只读的，可以修改 <br />   2、ResultSet.CONCUR_UPDATABLE  在ResultSet中的数据记录可以任意修改，然后更新会数据库 <br />其中resultSetHoldability可选值是： <br />   1、ResultSet.HOLD_CURSORS_OVER_COMMIT 表示修改提交时,不关闭ResultSet的游标 <br />   2、ResultSet.CLOSE_CURSORS_AT_COMMIT  表示修改提交时,关闭ResultSet的游标  <br /><br />对于查询操作第一种初始化方法createStatement()，相当于第二种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)，第三种方法的createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT)  <br /><br />下面写一段demo的代码，我把一些特征函数都用出来，但是只是用来查考和说明名灵活性的。  <br /><br /> Statement stmt2 = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br /> ResultSet rs2 = stmt.executeQuery("SELECT * FROM user"); <br /> rs2.next(); <br /> rs2.updateDate("lastdatetime", new Date(Calendar.getInstance().getTimeInMillis())); <br /> rs2.updateRow(); <br /> rs2.afterLast(); <br /> while(rs2.previous()){ /**....*/ } <br /> rs.beforeFirst(); <br /> while(rs2.next()){  /**....*/ } <br /> rs.last(); <br /> rs.first(); <br /> rs.absolute(5); //游标移动到第5条 <br /> rs.absolute(-1);  //游标移动到最后一条 <br /> rs.relative(-5);  //游标向上移动5条 <br /> rs.relative(2);   //游标向下移动2条 <br /> rs.deleteRow(); //删除当前行 <br /> rs.last();  //游标移动到最后 <br /> rs.updateString("summary", "This is ..."); //设置更新的字段值 <br /> rs.cancelRowUpdates();  //取消刚才输入的更新 <br /> rs.getRow(); //得到当前行号 <br /> rs.moveToInsertRow();  //游标移动到要新增的那条记录上 <br /> rs.updateInt("id", 1); <br /> rs.updateString(2, "my name"); <br /> rs.insertRow(); //插入新记录  <br /><br /><br />JDBC2.0提供的还有一个功能就是数据库的批量操作：  <br /><br />  con.setAutoCommit(false); <br />  Statement stmt3 = con.createStatement(); <br />  stmt3.addBatch("insert ....."); <br />  stmt3.addBatch("insert ....."); <br />  int[] rows = stmt3.executeBatch(); <br />  con.commit();  <br /><br />但是有一点要注意，stmt3.executeBatch()他不会自动给你回滚数据操作，当你有5条update语句的时候，如果第三条发生错误，那么将无法自动回滚前两条update语句的影响，所以一定要自己手工进行事务管理。  <br /><br /><b>在您的事务中使用 Savepoint</b>  <br />JDBC3.0中最令人兴奋的附加特点就是 Savepoint 了。有时候需要的是对事务多一点的控制，而不是在当前的事务中简单地对每一个改变进行回滚。在JDBC3.0下，您就可以通过 Savepoint 获得这种控制。Savepoint 接口允许您将事务分割为各个逻辑断点，以控制有多少事务需要回滚。看下面的代码：  <br /><br />conn.setAutoCommit(false);  <br />conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);  <br />Statement stmt = conn.createStatement();  <br />int rows = stmt.executeUpdate( "INSERT INTO authors (first_name, last_name) valueS(′Lewis′, ′Carroll′)");  <br />Savepoint svpt = conn.setSavepoint("NewAuthor");  <br />try{ <br /> rows = stmt.executeUpdate( "UPDATE authors set type = ′fiction′ WHERE last_name = ′Carroll′");  <br />}catch(Exception e){ <br /> conn.rollback(svpt); <br /> rows = stmt.executeUpdate( " update .......... other sql "); <br />} <br />conn.commit();  <br /><br />上面代码显示，当UPDATE authors失败的时候，系统事务回滚UPDATE authors的sql的影响，而INSERT INTO authors的sql仍然有效  <br /><br /><br /><b>检索自动产生的关键字 </b>  <br />为了解决对获取自动产生的或自动增加的关键字的值的需求，JDBC 3.0现在将获取这种值变得很轻松。要确定任何所产生的关键字的值，只要简单地在语句的 execute() 方法中指定一个可选的标记，Statement.RETURN_GENERATED_KEYS和Statement.NO_GENERATED_KEYS。在执行这条语句后，所产生的关键字的值就会通过从 Statement 的实例方法 getGeneratedKeys() 来检索 ResultSet 而获得。ResultSet 包含了每个所产生的关键字的列。看下面代码：  <br /><br />Statement stmt = conn.createStatement();  <br />stmt.executeUpdate("INSERT INTO authors (first_name, last_name) valueS (′George′, ′Orwell′)", Statement.RETURN_GENERATED_KEYS);  <br />ResultSet rs = stmt.getGeneratedKeys();  <br />if ( rs.next() ) {  <br /> int key = rs.getInt();  <br />}<br /><br /><a href="http://www.netskycn.com/article/articleId2913.html">http://www.netskycn.com/article/articleId2913.html</a><img src ="http://www.blogjava.net/wyz191/aggbug/97998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-05 14:38 <a href="http://www.blogjava.net/wyz191/articles/jdbc.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基本的类装入异常 </title><link>http://www.blogjava.net/wyz191/articles/97908.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Mon, 05 Feb 2007 00:29:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/97908.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/97908.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/97908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/97908.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/97908.html</trackback:ping><description><![CDATA[在java中，类装载异常虽然不是很常见，可如果发生异常，其处理还是比较麻烦的。<br />    下面的几种异常是比较常见的：<br /><b>ClassNotFoundException</b><br />    ClassNotFoundException 是最常见的类装入异常类型。它发生在装入阶段。Java 规范对 ClassNotFoundException 的描述是这样的：<br />    当应用程序试图通过类的字符串名称，使用以下三种方法装入类，但却找不到指定名称的类定义时抛出该异常。<br />    * 类 Class 中的 forName() 方法。<br />    * 类 ClassLoader 中的 findSystemClass() 方法。<br />    * 类 ClassLoader 中的 loadClass() 方法。<br />    所以，如果显式地装入类的尝试失败，那么就抛出 ClassNotFoundException。<br />    这些异常修复起来通常比较简单。可以用  verbose 选项检查类路径，确保使用的类路径设置正确。如果类路径设置正确，但是仍然看到这个错误，那么就是需要的类在类路径中不存在。要修复这个问题，可以把类移动到类路径中指定的目录或 JAR 文件中，或者把类所在的位置添加到类路径中。<br /><br /><b>NoClassDefFoundError</b><br />    NoClassDefFoundError 是类装入器在装入阶段抛出的另一个常见异常。JVM 规范对 NoClassDefFoundError 的定义如下：<br />    如果 Java 虚拟机或 ClassLoader 实例试图装入类定义（作为正常的方法调用的一部分，或者作为使用 new 表达式创建新实例的一部分），但却没有找到类定义时抛出该异常。<br />    当目前执行的类已经编译，但是找不到它的定义时，会存在 searched-for 类定义。 <br />    实际上，这意味着 NoClassDefFoundError 的抛出，是不成功的隐式类装入的结果。<br />    简单说来，就是引用的类在类路径中没有找到。<br /><b>ClassCastException</b><br />    类装入器能够抛出的另一个异常是 ClassCastException。它是在类型比较中发现不兼容类型的时候抛出的。JVM 规范指定 <b>ClassCastException </b>是：<br />    该异常的抛出，表明代码企图把对象的类型转换成一个子类，而该对象并不是这个子类的实例。 <br /><b>UnsatisfiedLinkError</b><br />    在把本地方法调用链接到对应的本机定义时，类装入器扮演着重要角色。如果程序试图装入一个不存在或者放错的本机库时，在链接阶段的解析过程会发生 UnsatisfiedLinkError。JVM 规范指定 UnsatisfiedLinkError 是：<br />    对于声明为 native 的方法，如果 Java 虚拟机找不到和它对应的本机语言定义，就会抛出该异常。 <br />    当调用本机方法时，类装入器会尝试装入定义了该方法的本机库。如果找不到这个库，就会抛出这个错误。<br />    本机库的装入由调用 System.loadLibrary() 方法的类的类装入器启动 ，根据使用的类装入器，会搜索不同的位置：<br />    * 对于由 bootstrap 类装入器装入的类，搜索 sun.boot.library.path。<br />    * 对于由扩展类装入器装入的类，先搜索 java.ext.dirs，然后是 sun.boot.library.path，然后是 java.library.path。<br />    * 对于由系统类装入器装入的类，搜索 sun.boot.library.path，然后是 java.library.path。<br /><b>ClassCircularityError</b><br />    JVM 规范指定 ClassCircularityError 的抛出条件是：<br />    类或接口由于是自己的超类或超接口而不能被装入。 <br />    这个错误是在链接阶段的解析过程中抛出的。这个错误有点奇怪，因为 Java 编译器不允许发生这种循环情况。但是，如果独立地编译类，然后再把它们放在一起，就可能发生这个错误。<br /><b>ClassFormatError</b><br />JVM 规范指出，抛出 ClassFormatError 的条件是：<br />    负责指定所请求的编译类或接口的二进制数据形式有误。 <br />    这个异常是在类装入的链接阶段的校验过程中抛出。如果字节码发生了更改，例如主版本号或次版本号发生了更改，那么二进制数据的形式就会有误。例如，如果对字节码故意做了更改，或者在通过网络传送类文件时现出了错误，那么就可能发生这个异常。<br />    修复这个问题的惟一方法就是获得字节码的正确副本，可能需要重新进行编译。<br /><b>ExceptionInInitializerError</b><br />根据 JVM 规范，抛出 ExceptionInInitializer 的情况是：<br />    * 如果初始化器突然完成，抛出一些异常 E，而且 E 的类不是 Error 或者它的某个子类，那么就会创建 ExceptionInInitializerError 类的一个新实例，并用 E 作为参数，用这个实例代替 E。<br />    * 如果 Java 虚拟机试图创建类 ExceptionInInitializerError 的新实例，但是因为出现 Out-Of-Memory-Error 而无法创建新实例，那么就抛出 OutOfMemoryError 对象作为代替。<br /><a href="/zyl/archive/2007/02/04/97881.html">http://www.blogjava.net/zyl/archive/2007/02/04/97881.html</a><img src ="http://www.blogjava.net/wyz191/aggbug/97908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-02-05 08:29 <a href="http://www.blogjava.net/wyz191/articles/97908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又谈乱码问题解决[转]</title><link>http://www.blogjava.net/wyz191/articles/95671.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Wed, 24 Jan 2007 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/95671.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/95671.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/95671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/95671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/95671.html</trackback:ping><description><![CDATA[
		<p>有人说，乱码问题一直跟中国的程序员特别有缘，真是再同意不过了，不管是Struts，JSF，JSP，还是MySQL，Tomcat，全都或多或少有乱码的问题。<br />一般的做法有用Filter： </p>
		<p> <font color="#ff0000">&lt; filter &gt; <br />     &lt; filter-name &gt; Set Character Encoding &lt;/ filter-name &gt; <br />     &lt; filter-class &gt; org.springframework.web.filter.CharacterEncodingFilter &lt;/ filter-class &gt; <br />     &lt; init-param &gt; <br />       &lt; param-name &gt; encoding &lt;/ param-name &gt; <br />       &lt; param-value &gt; GBK &lt;/ param-value &gt; <br />     &lt;/ init-param &gt; <br />     &lt; init-param &gt; <br />       &lt; param-name &gt; ignore &lt;/ param-name &gt; <br />       &lt; param-value &gt; true &lt;/ param-value &gt; <br />     &lt;/ init-param &gt; <br />   &lt;/ filter &gt; <br />   &lt; filter-mapping &gt; <br />     &lt; filter-name &gt; Set Character Encoding &lt;/ filter-name &gt; <br />     &lt; url-pattern &gt; *.do &lt;/ url-pattern &gt; <br />   &lt;/ filter-mapping &gt; <br />   &lt; filter-mapping &gt; <br />     &lt; filter-name &gt; Set Character Encoding &lt;/ filter-name &gt; <br />     &lt; url-pattern &gt; *.jsp &lt;/ url-pattern &gt; <br />   &lt;/ filter-mapping &gt; <br />   &lt; filter-mapping &gt; <br />     &lt; filter-name &gt; Set Character Encoding &lt;/ filter-name &gt; <br />     &lt; url-pattern &gt; *.html &lt;/ url-pattern &gt; <br />   &lt;/ filter-mapping &gt; <br />   &lt; filter-mapping &gt; <br />     &lt; filter-name &gt; Set Character Encoding &lt;/ filter-name &gt; <br />     &lt; url-pattern &gt; *.htm &lt;/ url-pattern &gt; <br />   &lt;/ filter-mapping &gt;</font></p>
		<p>的，有用</p>
		<p>
				<br />
				<font color="#ff1493"> <font color="#ff0000">&lt;% request.setCharacterEncoding( " GBK " ); %&gt;</font><br /></font>的，还有用</p>
		<p>
				<br />
				<font color="#ff0000"> &lt;% @ page contentType = " text/html; charset=GBK "  pageEncoding = " GBK " %&gt;</font>
				<br />
		</p>
		<p>
				<font color="#ff0000">&lt;meta http-equiv="content-type" content="text/html; charset=GBK"&gt;</font>
				<br />
				<br />的,还可以用</p>
		<p>
				<br />
				<font color="#ff0000"> &lt;%  String name  =   new  String(request.getParameter( " name " ).getBytes( " 8859_1 " ),  " GB2312 " );  %&gt;</font>
		</p>
		<p>昨天就在做项目的过程中，发现用URL传request参数的时候，在第二个页面上得到乱码的问题。把上面几种方法都试了一下还是不行。仔细追踪了一下，发现在页面的源代码上中文是正常的，一直到URL还是中文正常，可是在后台的Action里面log出来就成了乱码了，于是猜想是在request封装的过程中把中文变成乱码了，以致于后台直接就是取到的乱码。在后台Action中Set入中文，页面上正常显示，说明Struts的中文已经不存在问题。剩下的，应该就只有doGet和doPost方法的问题了。找了一下tomcat的配置文件，发现只要在server.xml中：</p>
		<p>
				<br />      &lt;!--  Define a non-SSL HTTP/1.1 Connector on port 8080  --&gt; <br />     &lt; Connector  port ="8080"  maxHttpHeaderSize ="8192" <br />               maxThreads ="150"  minSpareThreads ="25"  maxSpareThreads ="75" <br />               enableLookups ="false"  redirectPort ="8443"  acceptCount ="100" <br />               connectionTimeout ="20000"  disableUploadTimeout ="true" /&gt; <br />     &lt;!--  Note : To disable connection timeouts, set connectionTimeout value<br />     to 0  --&gt; <br />改为</p>
		<p>
				<br />      &lt;!--  Define a non-SSL HTTP/1.1 Connector on port 8080  --&gt; <br />     &lt; Connector  port ="8080"  maxHttpHeaderSize ="8192" <br />               maxThreads ="150"  minSpareThreads ="25"  maxSpareThreads ="75" <br />               enableLookups ="false"  redirectPort ="8443"  acceptCount ="100" <br />               connectionTimeout ="20000"  disableUploadTimeout ="true"  <font color="#ff1493"><font color="#ff0000">URIEncoding ="GBK"</font></font>/&gt; <br />     &lt;!--  Note : To disable connection timeouts, set connectionTimeout value<br />     to 0  --&gt; <br />就是加上URIEncoding="GBK"就万事大吉了。<br /><br />再加上一条：<br /><br />&lt;session-factory&gt;<br />　　&lt;property name="hibernate.connection.url"&gt;jdbc:jtds:sqlserver://192.168.0.3:1433;DatabaseName=HomeConsume;<font color="#ff0000">charset=GBK</font>&lt;/property&gt;<br />　　&lt;property name="hibernate.cglib.use_reflection_optimizer"&gt;true&lt;/property&gt;<br />　　&lt;property name="hibernate.connection.password"&gt;sju&lt;/property&gt;<br />　　&lt;property name="hibernate.connection.username"&gt;sa&lt;/property&gt;<br />　　&lt;property name="hibernate.connection.driver_class"&gt;net.sourceforge.jtds.jdbc.Driver&lt;/property&gt;<br />　　&lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.SQLServerDialect&lt;/property&gt;<br />　　&lt;mapping resource="net/magicyang/homeconsume/pojo/Test.hbm.xml" /&gt;<br />　　&lt;mapping resource="net/magicyang/homeconsume/pojo/Consumeinfo.hbm.xml" /&gt;<br />　　&lt;mapping resource="net/magicyang/homeconsume/pojo/Consumetype.hbm.xml" /&gt;<br />　　&lt;/session-factory&gt; <br />至此，应该再困难的乱码问题都解决了吧。就是要在页面上、数据库中、request里、doGet、doPost方法里面都是中文！看你还有什么地方躲？？ </p>
<img src ="http://www.blogjava.net/wyz191/aggbug/95671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-24 10:00 <a href="http://www.blogjava.net/wyz191/articles/95671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java抽象类和接口的区别[转载]</title><link>http://www.blogjava.net/wyz191/articles/95209.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Mon, 22 Jan 2007 00:53:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/95209.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/95209.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/95209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/95209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/95209.html</trackback:ping><description><![CDATA[
		<div align="left">
				<span style="FONT-WEIGHT: 400">
						<span class="unnamed4">
								<font style="FONT-SIZE: 9pt">abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制，正是由于这两种机制的存在，才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性，甚至可以相互替换，因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实，两者之间还是有很大的区别的，对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析，试图给开发者提供一个在二者之间进行选择的依据。  <br /><br />理解抽象类  <br /><br />abstract class和interface在Java语言中都是用来进行抽象类（本文中的抽象类并非从abstract class翻译而来，它表示的是一个抽象体，而abstract class为Java语言中用于定义抽象类的一种方法，请读者注意区分）定义的，那么什么是抽象类，使用抽象类能为我们带来什么好处呢？  <br /><br />在面向对象的概念中，我们知道所有的对象都是通过类来描绘的，但是反过来却不是这样。并不是所有的类都是用来描绘对象的，如果一个类中没有包含足够的信息来描绘一个具体的对象，这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。比如：如果我们进行一个图形编辑软件的开发，就会发现问题领域存在着圆、三角形这样一些具体概念，它们是不同的，但是它们又都属于形状这样一个概念，形状这个概念在问题领域是不存在的，它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念，所以用以表征抽象概念的抽象类是不能够实例化的。  <br /><br />在面向对象领域，抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述，但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类，而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体，因此它可以是不允许修改的；同时，通过从这个抽象体派生，也可扩展此模块的行为功能。熟悉OCP的读者一定知道，为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)，抽象类是其中的关键所在。  <br /><br /><br />从语法定义层面看abstract class和interface  <br /><br />在语法层面，Java语言对于abstract class和interface给出了不同的定义方式，下面以定义一个名为Demo的抽象类为例来说明这种不同。  <br /><br />使用abstract class的方式定义Demo抽象类的方式如下：  <br /><br />abstract class Demo ｛  <br /> abstract void method1();  <br /> abstract void method2();  <br /> …  <br />｝  <br /><br />使用interface的方式定义Demo抽象类的方式如下：  <br /><br />interface Demo {  <br /> void method1();  <br /> void method2();  <br /> …  <br />}  <br /><br />在abstract class方式中，Demo可以有自己的数据成员，也可以有非abstarct的成员方法，而在interface方式的实现中，Demo只能够有静态的不能被修改的数据成员（也就是必须是static final的，不过在interface中一般不定义数据成员），所有的成员方法都是abstract的。从某种意义上说，interface是一种特殊形式的abstract class。  <br /><br />      从编程的角度来看，abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。  <br /><br />首先，abstract class在Java语言中表示的是一种继承关系，一个类只能使用一次继承关系。但是，一个类却可以实现多个interface。也许，这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。  <br /><br />其次，在abstract class的定义中，我们可以赋予方法的默认行为。但是在interface的定义中，方法却不能拥有默认行为，为了绕过这个限制，必须使用委托，但是这会 增加一些复杂性，有时会造成很大的麻烦。  <br /><br />在抽象类中不能定义默认行为还存在另一个比较严重的问题，那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面（一般通过abstract class或者interface来表示）以适应新的情况（比如，添加新的方法或者给已用的方法中添加新的参数）时，就会非常的麻烦，可能要花费很多的时间（对于派生类很多的情况，尤为如此）。但是如果界面是通过abstract class来实现的，那么可能就只需要修改定义在abstract class中的默认行为就可以了。  <br /><br />同样，如果不能在抽象类中定义默认行为，就会导致同样的方法实现出现在该抽象类的每一个派生类中，违反了"one rule，one place"原则，造成代码重复，同样不利于以后的维护。因此，在abstract class和interface间进行选择时要非常的小心。  <br /><br /><br />从设计理念层面看abstract class和interface  <br /><br />上面主要从语法定义和编程的角度论述了abstract class和interface的区别，这些层面的区别是比较低层次的、非本质的。本小节将从另一个层面：abstract class和interface所反映出的设计理念，来分析一下二者的区别。作者认为，从这个层面进行分析才能理解二者概念的本质所在。  <br /><br />前面已经提到过，abstarct class在Java语言中体现了一种继承关系，要想使得继承关系合理，父类和派生类之间必须存在"is a"关系，即父类和派生类在概念本质上应该是相同的（参考文献〔3〕中有关于"is a"关系的大篇幅深入的论述，有兴趣的读者可以参考）。对于interface 来说则不然，并不要求interface的实现者和interface定义在概念本质上是一致的，仅仅是实现了interface定义的契约而已。为了使论述便于理解，下面将通过一个简单的实例进行说明。  <br /><br />考虑这样一个例子，假设在我们的问题领域中有一个关于Door的抽象概念，该Door具有执行两个动作open和close，此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型，定义方式分别如下所示：  <br /><br />使用abstract class方式定义Door：  <br /><br />abstract class Door {  <br /> abstract void open();  <br /> abstract void close()；  <br />}  <br /><br />   <br />使用interface方式定义Door：  <br /><br /><br />interface Door {  <br /> void open();  <br /> void close();  <br />}  <br /><br />   <br />其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。  <br /><br />如果现在要求Door还要具有报警的功能。我们该如何设计针对该例子的类结构呢（在本例中，主要是为了展示abstract class和interface反映在设计理念上的区别，其他方面无关的问题都做了简化或者忽略）？下面将罗列出可能的解决方案，并从设计理念层面对这些不同的方案进行分析。  <br /><br />解决方案一：  <br /><br />简单的在Door的定义中增加一个alarm方法，如下：  <br /><br />abstract class Door {  <br /> abstract void open();  <br /> abstract void close()；  <br /> abstract void alarm();  <br />}  <br /><br />   <br />或者  <br /><br />interface Door {  <br /> void open();  <br /> void close();  <br /> void alarm();  <br />}  <br /><br />   <br />那么具有报警功能的AlarmDoor的定义方式如下：  <br /><br />class AlarmDoor extends Door {  <br /> void open() { … }  <br /> void close() { … }  <br /> void alarm() { … }  <br />}  <br /><br />   <br />或者  <br /><br />class AlarmDoor implements Door ｛  <br /> void open() { … }  <br /> void close() { … }  <br /> void alarm() { … }  <br />｝  <br /><br />这种方法违反了面向对象设计中的一个核心原则ISP（Interface Segregation Priciple），在Door的定义中把Door概念本身固有的行为方法和另外一个概念"报警器"的行为方法混在了一起。这样引起的一个问题是那些仅仅依赖于Door这个概念的模块会因为"报警器"这个概念的改变（比如：修改alarm方法的参数）而改变，反之依然。  <br /><br />解决方案二：  <br /><br />既然open、close和alarm属于两个不同的概念，根据ISP原则应该把它们分别定义在代表这两个概念的抽象类中。定义方式有：这两个概念都使用abstract class方式定义；两个概念都使用interface方式定义；一个概念使用abstract class方式定义，另一个概念使用interface方式定义。  <br /><br />显然，由于Java语言不支持多重继承，所以两个概念都使用abstract class方式定义是不可行的。后面两种方式都是可行的，但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理。我们一一来分析、说明。  <br /><br />如果两个概念都使用interface方式来定义，那么就反映出两个问题：1、我们可能没有理解清楚问题领域，AlarmDoor在概念本质上到底是Door还是报警器？2、如果我们对于问题领域的理解没有问题，比如：我们通过对于问题领域的分析发现AlarmDoor在概念本质上和Door是一致的，那么我们在实现时就没有能够正确的揭示我们的设计意图，因为在这两个概念的定义上（均使用interface方式定义）反映不出上述含义。  <br /><br />如果我们对于问题领域的理解是：AlarmDoor在概念本质上是Door，同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢？前面已经说过，abstract class在Java语言中表示一种继承关系，而继承关系在本质上是"is a"关系。所以对于Door这个概念，我们应该使用abstarct class方式来定义。另外，AlarmDoor又具有报警功能，说明它又能够完成报警概念中定义的行为，所以报警概念可以通过interface方式定义。如下所示：  <br /><br />abstract class Door {  <br /> abstract void open();  <br /> abstract void close()；  <br />}  <br />interface Alarm {  <br /> void alarm();  <br />}  <br />class AlarmDoor extends Door implements Alarm {  <br /> void open() { … }  <br /> void close() { … }  <br />    void alarm() { … }  <br />}  <br /><br />   <br />这种实现方式基本上能够明确的反映出我们对于问题领域的理解，正确的揭示我们的设计意图。其实abstract class表示的是"is a"关系，interface表示的是"like a"关系，大家在选择时可以作为一个依据，当然这是建立在对问题领域的理解上的，比如：如果我们认为AlarmDoor在概念本质上是报警器，同时又具有Door的功能，那么上述的定义方式就要反过来了。</font>
						</span>
				</span>
		</div>
		<a href="http://www.huihoo.com/">
		</a>
<img src ="http://www.blogjava.net/wyz191/aggbug/95209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-22 08:53 <a href="http://www.blogjava.net/wyz191/articles/95209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多级反向代理[Squid]下获取客户端真实IP地址 </title><link>http://www.blogjava.net/wyz191/articles/93624.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Sat, 13 Jan 2007 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/93624.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/93624.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/93624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/93624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/93624.html</trackback:ping><description><![CDATA[
		<font size="2">在很多应用下都可能有需要将用户的真实IP记录下来，这时就要获得用户的真实IP地址，在JSP里，获取客户端的IP地址的方法是：<strong>request.getRemoteAddr()</strong>，这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。<br /><br />　　这段时间在做IP统计的程序设计，由于服务器作了集群，使用了反向代理软件，将</font>
		<a href="http://192.168.1.110:2046/">
				<font color="#1a8bc8" size="2">http://192.168.1.110:2046/</font>
		</a>
		<font size="2">的URL反向代理为</font>
		<a href="http://www.xxx.com/">
				<font color="#1a8bc8" size="2">http://www.xxx.com/</font>
		</a>
		<font size="2">的URL时，用<strong>request.getRemoteAddr()</strong>方法获取的IP地址是：127.0.0.1　或　<u><font color="#0000ff">192.168.1.110</font></u>，而并不是客户端的真实ＩＰ。这是什么原因呢？<br /><br />　　这是反向代理的原因。经过代理以后，由于在客户端和服务之间增加了中间层，因此服务器无法直接拿到客户端的IP，服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中，增加了X－FORWARDED－FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问</font>
		<a href="http://www.xxx.com/index.jsp/">
				<font color="#1a8bc8" size="2">http://www.xxx.com/index.jsp/</font>
		</a>
		<font size="2">时，其实并不是我们浏览器真正访问到了服务器上的index.jsp文件，而是先由代理服务器去访问</font>
		<a href="http://xxx.xxx.xxx.xxx:2046/index.jsp">
				<font color="#1a8bc8" size="2">http://192.168.1.110:2046/index.jsp</font>
		</a>
		<font size="2">，代理服务器再将访问到的结果返回给我们的浏览器，因为是代理服务器去访问index.jsp的，所以index.jsp中通过<strong>request.getRemoteAddr()</strong>的方法获取的IP实际上是代理服务器的地址，并不是客户端的IP地址。<br /><br />　　于是可得出获得客户端真实IP地址的方法一：<br /><br /></font>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<span style="COLOR: #008080">1</span>
						<img id="Codehighlighter1_53_229_Open_Image" onclick="this.style.display='none'; Codehighlighter1_53_229_Open_Text.style.display='none'; Codehighlighter1_53_229_Closed_Image.style.display='inline'; Codehighlighter1_53_229_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_53_229_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_53_229_Closed_Text.style.display='none'; Codehighlighter1_53_229_Open_Image.style.display='inline'; Codehighlighter1_53_229_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> String getIpAddr(HttpServletRequest request) </span>
						<span id="Codehighlighter1_53_229_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_53_229_Open_Text">
						<font size="2">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080">2</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />      String ip </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> request.getHeader(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">x-forwarded-for</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080">3</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_152_204_Open_Image" onclick="this.style.display='none'; Codehighlighter1_152_204_Open_Text.style.display='none'; Codehighlighter1_152_204_Closed_Image.style.display='inline'; Codehighlighter1_152_204_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_152_204_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_152_204_Closed_Text.style.display='none'; Codehighlighter1_152_204_Open_Image.style.display='inline'; Codehighlighter1_152_204_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />      </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(ip </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> ip.length() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000">) </span>
								<span id="Codehighlighter1_152_204_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
						<span id="Codehighlighter1_152_204_Open_Text">
								<font size="2">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">4</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ip </span>
										<span style="COLOR: #000000">=</span>
								</font>
								<font size="2">
										<span style="COLOR: #000000"> request.getRemoteAddr();<br /></span>
										<span style="COLOR: #008080">5</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</font>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: #008080">6</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000"> ip;<br /></span>
								<span style="COLOR: #008080">7</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
						</font>
				</span>
		</div>
		<br />
		<font size="2">　　可是当我访问</font>
		<a href="http://www.xxx.com/index.jsp/">
				<font color="#1a8bc8" size="2">http://www.xxx.com/index.jsp/</font>
		</a>
		<font size="2">时，返回的IP地址始终是unknown，也并不是如上所示的127.0.0.1　或　<u><font color="#0000ff">192.168.1.110</font></u>了，而我访问</font>
		<a href="http://xxx.xxx.xxx.xxx:2046/index.jsp">
				<font color="#1a8bc8" size="2">http://192.168.1.110:2046/index.jsp</font>
		</a>
		<font size="2">时，则能返回客户端的真实IP地址，写了个方法去验证。<br /><br />　　 </font>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<span style="COLOR: #008080"> 1</span>
						<img id="Codehighlighter1_2_29_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_29_Open_Text.style.display='none'; Codehighlighter1_2_29_Closed_Image.style.display='inline'; Codehighlighter1_2_29_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_2_29_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2_29_Closed_Text.style.display='none'; Codehighlighter1_2_29_Open_Image.style.display='inline'; Codehighlighter1_2_29_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span id="Codehighlighter1_2_29_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_2_29_Open_Text">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page import</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">java.util.*</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> </span>
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span>
				</font>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<span style="COLOR: #008080"> 2</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">table </span>
						<span style="COLOR: #ff0000">border</span>
						<span style="COLOR: #0000ff">=1 </span>
						<span style="COLOR: #ff0000">cellspacing</span>
						<span style="COLOR: #0000ff">=0 </span>
						<span style="COLOR: #ff0000">cellpadding</span>
						<span style="COLOR: #0000ff">=0 </span>
						<span style="COLOR: #ff0000">align</span>
						<span style="COLOR: #0000ff">=center</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 3</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">tr</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 4</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">th</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">Name</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">th</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 5</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">th</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000">Value</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">th</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 6</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">tr</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080"> 7</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_138_362_Open_Image" onclick="this.style.display='none'; Codehighlighter1_138_362_Open_Text.style.display='none'; Codehighlighter1_138_362_Closed_Image.style.display='inline'; Codehighlighter1_138_362_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_138_362_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_138_362_Closed_Text.style.display='none'; Codehighlighter1_138_362_Open_Image.style.display='inline'; Codehighlighter1_138_362_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span id="Codehighlighter1_138_362_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_138_362_Open_Text">
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> <br /></span>
								<span style="COLOR: #008080"> 8</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />Enumeration enumNames; <br /></span>
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">String</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> strName,strValue; <br /></span>
								<span style="COLOR: #008080">10</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
										<br />
								</span>
								<span style="COLOR: #008080">11</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />enumNames </span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> request.getHeaderNames(); <br /></span>
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">while</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">(enumNames.hasMoreElements()){ <br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    strName </span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> (</span>
								<span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">String</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">)enumNames.nextElement(); <br /></span>
								<span style="COLOR: #008080">14</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    strValue </span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> request.getHeader(strName); <br /></span>
								<span style="COLOR: #008080">15</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    </span>
						</font>
				</span>
				<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">
						<font size="2">%&gt;</font>
				</span>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">16</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">tr</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">17</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">td</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">strName</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">td</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">18</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">td</span>
						<span style="COLOR: #0000ff">&gt;</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">strValue</span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">td</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">19</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">tr</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<font size="2">
						<span style="COLOR: #000000"> <br /></span>
						<span style="COLOR: #008080">20</span>
						<span style="COLOR: #000000">
								<img id="Codehighlighter1_449_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_449_453_Open_Text.style.display='none'; Codehighlighter1_449_453_Closed_Image.style.display='inline'; Codehighlighter1_449_453_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
								<img id="Codehighlighter1_449_453_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_449_453_Closed_Text.style.display='none'; Codehighlighter1_449_453_Open_Image.style.display='inline'; Codehighlighter1_449_453_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span>
						<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span>
						<span id="Codehighlighter1_449_453_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_449_453_Open_Text">
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> <br /></span>
								<span style="COLOR: #008080">21</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />} <br /></span>
								<span style="COLOR: #008080">22</span>
								<span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">
										<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
								</span>
						</font>
				</span>
				<span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">
						<font size="2">%&gt;</font>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<span style="COLOR: #008080">23</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;</span>
						<span style="COLOR: #800000">tr</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<span style="COLOR: #008080">24</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #0000ff">&lt;/</span>
						<span style="COLOR: #800000">table</span>
						<span style="COLOR: #0000ff">&gt;</span>
				</font>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<span style="COLOR: #008080">25</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</font>
		</div>
		<br />
		<br />
		<font size="2">　　出来的结果：X-Forwarded-For: unknown　。X-Forwarded-For确实存在，但其值却为unknown，继续找原因。上网搜了搜，原因出在了Squid上。<br /><br />squid.conf 的配制文件　forwarded_for 项默认是为on，如果 forwarded_for 设成了 off 　则：<br /><br />X-Forwarded-For: unknown<br /><br />一查，发现forwarded_for 项设为了off，原因找到了，把forwarded_for 项设为了on，重启后，访问</font>
		<a href="http://www.xxx.com/index.jsp/">
				<font color="#1a8bc8" size="2">http://www.xxx.com/index.jsp/</font>
		</a>
		<font size="2">　获得的IP是客户端的真实IP。<br /><br />　　于是可得出获得客户端真实IP地址的方法二：<br /><br /></font>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font size="2">
						<span style="COLOR: #008080"> 1</span>
						<img id="Codehighlighter1_56_561_Open_Image" onclick="this.style.display='none'; Codehighlighter1_56_561_Open_Text.style.display='none'; Codehighlighter1_56_561_Closed_Image.style.display='inline'; Codehighlighter1_56_561_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_56_561_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_56_561_Closed_Text.style.display='none'; Codehighlighter1_56_561_Open_Image.style.display='inline'; Codehighlighter1_56_561_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span style="COLOR: #000000">    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> String getIpAddr(HttpServletRequest request) </span>
						<span id="Codehighlighter1_56_561_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
				</font>
				<span id="Codehighlighter1_56_561_Open_Text">
						<font size="2">
								<span style="COLOR: #000000">{<br /></span>
								<span style="COLOR: #008080"> 2</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String ip </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> request.getHeader(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">x-forwarded-for</span>
								<span style="COLOR: #000000">"</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000">);<br /></span>
								<span style="COLOR: #008080"> 3</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_193_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_193_258_Open_Text.style.display='none'; Codehighlighter1_193_258_Closed_Image.style.display='inline'; Codehighlighter1_193_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_193_258_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_258_Closed_Text.style.display='none'; Codehighlighter1_193_258_Open_Image.style.display='inline'; Codehighlighter1_193_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(ip </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> ip.length() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">unknown</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">.equalsIgnoreCase(ip)) </span>
								<span id="Codehighlighter1_193_258_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
						<span id="Codehighlighter1_193_258_Open_Text">
								<font size="2">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 4</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ip </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> request.getHeader(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">Proxy-Client-IP</span>
										<span style="COLOR: #000000">"</span>
								</font>
								<font size="2">
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080"> 5</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</font>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: #008080"> 6</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_337_405_Open_Image" onclick="this.style.display='none'; Codehighlighter1_337_405_Open_Text.style.display='none'; Codehighlighter1_337_405_Closed_Image.style.display='inline'; Codehighlighter1_337_405_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_337_405_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_337_405_Closed_Text.style.display='none'; Codehighlighter1_337_405_Open_Image.style.display='inline'; Codehighlighter1_337_405_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(ip </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> ip.length() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">unknown</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">.equalsIgnoreCase(ip)) </span>
								<span id="Codehighlighter1_337_405_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
						<span id="Codehighlighter1_337_405_Open_Text">
								<font size="2">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080"> 7</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ip </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> request.getHeader(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">WL-Proxy-Client-IP</span>
										<span style="COLOR: #000000">"</span>
								</font>
								<font size="2">
										<span style="COLOR: #000000">);<br /></span>
										<span style="COLOR: #008080"> 8</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</font>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: #008080"> 9</span>
								<span style="COLOR: #000000">
										<img id="Codehighlighter1_484_536_Open_Image" onclick="this.style.display='none'; Codehighlighter1_484_536_Open_Text.style.display='none'; Codehighlighter1_484_536_Closed_Image.style.display='inline'; Codehighlighter1_484_536_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_484_536_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_484_536_Closed_Text.style.display='none'; Codehighlighter1_484_536_Open_Image.style.display='inline'; Codehighlighter1_484_536_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(ip </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> ip.length() </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">0</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">unknown</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">.equalsIgnoreCase(ip)) </span>
								<span id="Codehighlighter1_484_536_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
						</font>
						<span id="Codehighlighter1_484_536_Open_Text">
								<font size="2">
										<span style="COLOR: #000000">{<br /></span>
										<span style="COLOR: #008080">10</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ip </span>
										<span style="COLOR: #000000">=</span>
								</font>
								<font size="2">
										<span style="COLOR: #000000"> request.getRemoteAddr();<br /></span>
										<span style="COLOR: #008080">11</span>
										<span style="COLOR: #000000">
												<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</font>
						</span>
						<span style="COLOR: #000000">
								<br />
						</span>
						<font size="2">
								<span style="COLOR: #008080">12</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">return</span>
						</font>
						<font size="2">
								<span style="COLOR: #000000"> ip;<br /></span>
								<span style="COLOR: #008080">13</span>
								<span style="COLOR: #000000">
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span>
						</font>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
				<font size="2">
						<span style="COLOR: #008080">14</span>
						<span style="COLOR: #000000">
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
				</font>
		</div>
		<p>
				<br />
				<br />
				<font size="2">　　可是，如果通过了多级反向代理的话，X-Forwarded-For的值并不止一个，而是一串Ｉｐ值，究竟哪个才是真正的用户端的真实IP呢？<br /><br />　　答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。<br /><br />　　如：<br />　　X-Forwarded-For：192.168.1.110, 192.168.1.120, 192.168.1.130, 192.168.1.100<br />　　用户真实IP为： 192.168.1.110<br /></font>
		</p>
<img src ="http://www.blogjava.net/wyz191/aggbug/93624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-13 18:03 <a href="http://www.blogjava.net/wyz191/articles/93624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JFreeChart在JSP中的应用实例 [转]</title><link>http://www.blogjava.net/wyz191/articles/jfreechart.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Sat, 13 Jan 2007 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/wyz191/articles/jfreechart.html</guid><wfw:comment>http://www.blogjava.net/wyz191/comments/93623.html</wfw:comment><comments>http://www.blogjava.net/wyz191/articles/jfreechart.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wyz191/comments/commentRss/93623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wyz191/services/trackbacks/93623.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前段时间，也就是去年，在做一个项目的时候有这样一个需求，根据用户在Ｗｅｂ页面上向服务器提交的数据，根据条件从数据库中取出相应的一系列数据后，要能在web浏览器上以图表的形式显示结果，形成直观的对比，于是就要我们实现饼图，柱图的动态生成。在网上找了很久，找到了JFreeChart这么一个东西。JFreeChart				是一个开源的				JAVA				项目，它主要用来开发各种各样的图...&nbsp;&nbsp;<a href='http://www.blogjava.net/wyz191/articles/jfreechart.html'>阅读全文</a><img src ="http://www.blogjava.net/wyz191/aggbug/93623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-13 17:48 <a href="http://www.blogjava.net/wyz191/articles/jfreechart.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>