﻿<?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-无止境-文章分类-java</title><link>http://www.blogjava.net/wady/category/22586.html</link><description>勤</description><language>zh-cn</language><lastBuildDate>Thu, 24 Apr 2008 04:59:09 GMT</lastBuildDate><pubDate>Thu, 24 Apr 2008 04:59:09 GMT</pubDate><ttl>60</ttl><item><title>Java线程控制的图像分割与合成</title><link>http://www.blogjava.net/wady/articles/195439.html</link><dc:creator>wady</dc:creator><author>wady</author><pubDate>Thu, 24 Apr 2008 02:40:00 GMT</pubDate><guid>http://www.blogjava.net/wady/articles/195439.html</guid><wfw:comment>http://www.blogjava.net/wady/comments/195439.html</wfw:comment><comments>http://www.blogjava.net/wady/articles/195439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wady/comments/commentRss/195439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wady/services/trackbacks/195439.html</trackback:ping><description><![CDATA[Java是一种面向对象的编程语言。它具有与平台无关、面向对象、动态、安全等特点，允许直接使用多线程方式进行编程，对程序进行并发控制。Java还支持分布式网络操作，从而能够方便地进行网络文件对象的存取。利用Java语言本身提供的绘图功能，可以绘制一些简单的图形。而对于复杂图形，一般先用绘图软件制成图像，然后采用Java所提供的方法对图像下载并进行处理和控制，从而实现静态图像的动态显示。 <br />
<br />
　　1　Java图像处理与线程的并发控制 <br />
<br />
　　1.1　Java图像处理 <br />
<br />
　　Java语言提供了丰富的类(Class)、接口(Interface)以及相应的调用方法(Method)。使用这些类或接口，可以定义自己的类或子类，充分利用Java面向对象的特性进行编程。在java.awt包中，提供了专门的Image类，它是1种抽象类，可提供抽象的方法描绘图片的一些共同特性。而在Applet类和Tookit类中都提供了2种getImage()方法下载图像，分别根据绝对地址和相对地址查询所要下载的图像。通常采用相对地址的下载方法，它的语法定义及功能如下： <br />
<br />
　　1.public Image getImage(URL url,String name) <br />
<br />
　　功能：根据相对地址下载图像。 <br />
<br />
　　参数：url??URL(统一资源定位)基地址， name 图像文件名。 <br />
<br />
　　获取图像后就可以调用Graphics类提供的drawImage()方法显示图像。 <br />
<br />
　　2.public drawImage(Image img,int x,int y,observer) <br />
<br />
　　功能：在指定位置显示图像。 <br />
<br />
　　参数：img 待显示图像，x 横坐标，y 纵坐标，observer 图像监视器，用来监视图像的下载情况，接受图像装载信息(当图像完全载入时返回True，否则返回False)。<br />
<br />
　　在显示图像时，通常希望获得对图像的控制，从而以自己喜欢的各种方式实现<a href="http://www.qqread.com/keywords/media.html" target="_blank">媒体播放</a>。为此，Java专门提供了用于跟踪包括图像和声音等<a href="http://www.qqread.com/keywords/mutimedia.html" target="_blank">多媒体</a>对象的ImageObserver类和MediaTracker类，在本文程序中主要用到的是跟踪多幅图像状态的MediaTracker类。 <br />
<br />
　　1.2　Java多线程并发功能 <br />
<br />
　　目前，线程(Thread)已经为许多<a href="http://www.qqread.com/os/" target="_blank">操作系统</a>和应用开发系统所采用。线程是程序的单个控制流，具有顺序程序的特点，但是线程不是1个程序，它仅仅是程序的1个执行序列。线程具有很强的并发功能，在同一时刻可能有多个线程同时处于执行状态。线程是动态的，具有一定的生命周期，分别经历从创建、执行、阻塞直到消亡的过程。Java语言中提供了专门的Thread类，以支持直接的多线程编程。Thread类提供了对线程的控制方法，如Start(),Stop(),Run()、Suspend()、resume()、Sleep()以及Run()方法等等，它们可以对线程的状态进行控制。并可以运用SetPriority()方法设置线程的运行优先顺序。Thread类的定义方法如下： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　Thread(ThreadGroup group,Runable target,String name) </td>
        </tr>
    </tbody>
</table>
<br />
　　SetPriority()用来设置线程的优先级。线程优先级是1个介于MINPRIORITY(在类中定义为1)和MAXPRIORITY(在类中定义为10)之间的整数。线程不同的优先级决定了不同线程之间的切换。<br />
<br />
2　<a href="http://www.qqread.com/keywords/java.html" target="_blank">Java</a>图像分割与合成的算法及实现 <br />
<br />
　　Java程序首先将一个完整的图像下载，然后将其分割成20个单元拼图，即分为5行4列。在本例中特地将第20幅图像单元设为1个空白图像，以便拼图时用户交互操作使用。这些参数分别定义在相应的变量中。 <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　final int XCELLS=5;　　//每行拼图的数目 <br />
            　　final int YCELLS=4;//每列拼图的数目 <br />
            　　final int ALLCELLS=20;//分割元素的数目 <br />
            　　final int EMPTY=19;//将第20单元，即cells［19］置成 <br />
            　　//空白图像 </td>
        </tr>
    </tbody>
</table>
<br />
　　然后将这些图像分割单元存于1个Cell类数组cells［］中，在这里Cell类中含有图像以及它的起始位置和当前位置，其具体定义如下： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　class Cell <br />
            　　{int sx,sy;　//起始位置 <br />
            　　int cx,cy;　//当前位置 <br />
            　　Image img;　//单元图像 <br />
            　　public Cell(Image img,int x,int y)　//Cell类构造函数 <br />
            　　{this.img=img; <br />
            　　sx=x;sy=y;}　//给起始位置赋值为x,y <br />
            　　} </td>
        </tr>
    </tbody>
</table>
<br />
　　为了对每个图像分割单元进行状态跟踪，还需要建立1个MediaTracker类的实体(instance)，然后调用addImage()方法，为每个要跟踪的图像指定1个唯一的标识符。标识符决定了图像获取时的优先顺序并使得图像能够独立完整地进行处理。 <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td height="147">　　MediaTracker tracker=new MediaTracker(this) <br />
            　　//为当前使用类建立1个MediaTracker实体，用于跟踪类 <br />
            　　//上的图像 <br />
            　　cells［EMPTY］=new Cell(createEmpty(),toPoint(EMPTY).x,toPoint(EMPTY).y); <br />
            　　tracker.addImage(cells［EMPTY］.img,0); <br />
            　　//调用createEmpty()方法产生空白图像，并加入到所跟踪 <br />
            　　//的cells数组中20单元 <br />
            　　void setPosition(int x,int y)　　//设置单元图像当前位置 <br />
            　　{cx=x;cy=y;} </td>
        </tr>
    </tbody>
</table>
<br />
　　各个图像单元的位置存放于位置数组position里： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　int position［］［］=new int［XCELLs］［YCELLS］ </td>
        </tr>
    </tbody>
</table>
<br />
　　这样就可以使用Cell类数组cells［］对图像的各个单元进行操作，从而将各个单元图像进行合成显示，并通过position［］［］数组改变各个单元的位置。为了对各单元进行并发操作，需要对线程加以控制，并通过鼠标事件和按键事件控制进程的开始、睡眠和进行等状态变化，其实现方法如下(仅以run()方法为例)： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　Thread imageThread=null;　//定义线程imageThread,初始 <br />
            //值为空 <br />
            　　public void run() <br />
            　　{imageThread.setPriority(Thread.MINPRIORITY);//设置线 <br />
            //程执行优先级别 <br />
            <br />
            　　try <br />
            　　　　{imageThread.sleep(2000);//线程睡眠等待2000ms <br />
            　　　　}catch(InterruptedException e){} <br />
            　　first=changeArray();//调用changeArray()方法随机改变图 <br />
            //像单元位置 <br />
            　　while(!loaded)//判断图像若未被跟踪载入，则调用相关 <br />
            //方法跟踪并加载图像 <br />
            　　　　{repaint(); <br />
            　　　　try <br />
            　　　　　{imageThread.sleep(100); <br />
            　　　　　}catch(InterruptedException e){System.out.println(e);} <br />
            　　　　} <br />
            　　} </td>
        </tr>
    </tbody>
</table>
<br />
　　changeArray()方法用来随机地改变图像单元的位置，其实现方法如下： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　boolean changeArray() <br />
            　　{ <br />
            　　int source［］=new int［20］; <br />
            　　int full［］=new int［20］; <br />
            　　for(int i=0;i&lt;ALLCELLS;i++) <br />
            　　　　{ <br />
            　　　　int r=(int)(Math.random()*20); <br />
            　　　　while(full［r］!=0) <br />
            　　　　r=(r+(int)(Math.random()*20))%20; <br />
            　　　　source［i］=r; <br />
            　　　　full［r］=1; <br />
            　　　　} <br />
            　　int pos=0; <br />
            　　for(int i=0;i&lt;ALLCELLS;i++,pos++) <br />
            　　　　{ <br />
            　　　　Point p=toPoint(source［pos］); <br />
            　　　　cells［pos］.setPosition(p.x,p.y); <br />
            　　　　position［p.x］［p.y］=pos; <br />
            　　　　} <br />
            　　x=cells［EMPTY］.cx; <br />
            　　y=cells［EMPTY］.cy; <br />
            　　return(false); <br />
            　　} </td>
        </tr>
    </tbody>
</table>
<br />
　　当applet执行后点击鼠标，线程就被启动，开始装载图像并执行changeArray()随机选择1个位置来移动图像单元，此时可以使用键盘移动图像上的任意单元到任何位置。在这里还有一个重要内容就是怎样将图像分割成许多的单元，我们可以通过引用CropImageFilter方法来分割图像，它是1个分割图像过滤器。其实现方法如下： <br />
<br />
<table width="100%" bgcolor="#ffffff">
    <tbody>
        <tr>
            <td>　　Image crop(int pos) <br />
            　　{//pos参数为调用函数给出的图像单元位置号 <br />
            　　Point p=toPoint(pos);//将位置号转化为坐标形式 <br />
            　　ImageFilter filter=new CropImageFilter(xside*p.x,yside*p.y,xside,yside); <br />
            　　//在给定坐标和长宽的绝对矩形区域内创建分割图像过 <br />
            　　//滤器实体filter <br />
            　　ImageProducer producer=new FilteredImageSource(baseImage.getSource(),filter;) <br />
            <br />
            　　//由原图像和分割图像过滤器实体创建新的图像 <br />
            <br />
            　　//产生器producer <br />
            　　return createImage(producer);//由图像产生器producer产生 <br />
            //图像并返回 <br />
            　　} </td>
        </tr>
    </tbody>
</table>
<br />
　　通过以上步骤，整个图像的分割与合成显示就完成了。本程序主要利用了crop()、changeArray()、mousedown()、Thread()等方法以及几个表示程序运行状态的布尔变量实现了一个线程控制和动感图像相结合的<a href="http://www.qqread.com/keywords/image-processing.html" target="_blank">图像处理</a>过程。
<img src ="http://www.blogjava.net/wady/aggbug/195439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wady/" target="_blank">wady</a> 2008-04-24 10:40 <a href="http://www.blogjava.net/wady/articles/195439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多级反向代理[Squid]下获取客户端真实IP地址 </title><link>http://www.blogjava.net/wady/articles/195426.html</link><dc:creator>wady</dc:creator><author>wady</author><pubDate>Thu, 24 Apr 2008 02:31:00 GMT</pubDate><guid>http://www.blogjava.net/wady/articles/195426.html</guid><wfw:comment>http://www.blogjava.net/wady/comments/195426.html</wfw:comment><comments>http://www.blogjava.net/wady/articles/195426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wady/comments/commentRss/195426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wady/services/trackbacks/195426.html</trackback:ping><description><![CDATA[在很多应用下都可能有需要将用户的真实IP记录下来，这时就要获得用户的真实IP地址，在JSP里，获取客户端的IP地址的方法是：<strong>request.getRemoteAddr()</strong>，这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。<br />
<br />
　　这段时间在做IP统计的程序设计，由于服务器作了集群，使用了反向代理软件，将<a href="http://192.168.1.110:2046/">http://192.168.1.110:2046/</a>的URL反向代理为<a href="http://www.xxx.com/">http://www.xxx.com/</a>的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地址和原来客户端请求的服务器地址。当我们访问<a href="http://www.xxx.com/index.jsp/">http://www.xxx.com/index.jsp/</a>时，其实并不是我们浏览器真正访问到了服务器上的index.jsp文件，而是先由代理服务器去访问<a href="http://xxx.xxx.xxx.xxx:2046/index.jsp">http://192.168.1.110:2046/index.jsp</a>，代理服务器再将访问到的结果返回给我们的浏览器，因为是代理服务器去访问index.jsp的，所以index.jsp中通过<strong>request.getRemoteAddr()</strong>的方法获取的IP实际上是代理服务器的地址，并不是客户端的IP地址。<br />
<br />
　　于是可得出获得客户端真实IP地址的方法一：<br />
<br />
<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"><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"  alt="" /><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"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getIpAddr(HttpServletRequest&nbsp;request)&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_53_229_Open_Text"><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">x-forwarded-for</span><span style="color: #000000">"</span><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"  alt="" /><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_152_204_Open_Text"><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
　　可是当我访问<a href="http://www.xxx.com/index.jsp/">http://www.xxx.com/index.jsp/</a>时，返回的IP地址始终是unknown，也并不是如上所示的127.0.0.1　或　<u><font color="#0000ff">192.168.1.110</font></u>了，而我访问<a href="http://xxx.xxx.xxx.xxx:2046/index.jsp">http://192.168.1.110:2046/index.jsp</a>时，则能返回客户端的真实IP地址，写了个方法去验证。<br />
<br />
　　
<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"><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" /><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"  alt="" /></span><span id="Codehighlighter1_2_29_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;page&nbsp;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">&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">table&nbsp;</span><span style="color: #ff0000">border</span><span style="color: #0000ff">=1&nbsp;</span><span style="color: #ff0000">cellspacing</span><span style="color: #0000ff">=0&nbsp;</span><span style="color: #ff0000">cellpadding</span><span style="color: #0000ff">=0&nbsp;</span><span style="color: #ff0000">align</span><span style="color: #0000ff">=center</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></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><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></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><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" /></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"  alt="" /></span><span id="Codehighlighter1_138_362_Open_Text"><span style="color: #000000; background-color: #f5f5f5">&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000; background-color: #f5f5f5"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />Enumeration&nbsp;enumNames;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000; background-color: #f5f5f5"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;strName,strValue;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000; background-color: #f5f5f5"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><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"  alt="" />enumNames&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;request.getHeaderNames();&nbsp;<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"  alt="" /></span><span style="color: #0000ff; background-color: #f5f5f5">while</span><span style="color: #000000; background-color: #f5f5f5">(enumNames.hasMoreElements()){&nbsp;<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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;strName&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;(</span><span style="color: #0000ff; background-color: #f5f5f5">String</span><span style="color: #000000; background-color: #f5f5f5">)enumNames.nextElement();&nbsp;<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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;strValue&nbsp;</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;request.getHeader(strName);&nbsp;<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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</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><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</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><span style="color: #000000">&nbsp;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<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"  alt="" /><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_449_453_Open_Text"><span style="color: #000000; background-color: #f5f5f5">&nbsp;<br />
</span><span style="color: #008080">21</span><span style="color: #000000; background-color: #f5f5f5"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}&nbsp;<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"  alt="" /></span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">table</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
　　出来的结果：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，重启后，访问<a href="http://www.xxx.com/index.jsp/">http://www.xxx.com/index.jsp/</a>　获得的IP是客户端的真实IP。<br />
<br />
　　于是可得出获得客户端真实IP地址的方法二：<br />
<br />
<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"><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getIpAddr(HttpServletRequest&nbsp;request)&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_56_561_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">x-forwarded-for</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_193_258_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Proxy-Client-IP</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_337_405_Open_Text"><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">WL-Proxy-Client-IP</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;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"  alt="" /><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</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"  alt="" /></span><span id="Codehighlighter1_484_536_Open_Text"><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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;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"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
<br />
　　可是，如果通过了多级反向代理的话，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</p>
<br />
<br />
<span id="ctl00_MainContentPlaceholder_ctl01_ctl00_lblEntry">&nbsp;
<div class="bvEntry" id="entrycns!a69e0c9201459621!377" bv:cns="cns!a69e0c9201459621!377" bv:ca="true" bv:cat="JAVA">
<h4 id="subjcns!a69e0c9201459621!377" style="margin-bottom: 0px">apache、lighttpd+resin、tomcat 取得客户端ip</h4>
<div class="bvMsg" id="msgcns!a69e0c9201459621!377">
<p>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getIpAddr(HttpServletRequest&nbsp;request)&nbsp;</span><span><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">x-forwarded-for</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</span><span><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">Proxy-Client-IP</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</span><span><span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getHeader(</span><span style="color: #000000">"</span><span style="color: #000000">WL-Proxy-Client-IP</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(ip&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;ip.length()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">.equalsIgnoreCase(ip))&nbsp;</span><span><span style="color: #000000">{<br />
</span><span style="color: #008080">10</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;request.getRemoteAddr();<br />
</span><span style="color: #008080">11</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ip;<br />
</span><span style="color: #008080">13</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
</span></span></p>
</div>
</div>
<img src ="http://www.blogjava.net/wady/aggbug/195426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wady/" target="_blank">wady</a> 2008-04-24 10:31 <a href="http://www.blogjava.net/wady/articles/195426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>