<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Java | SDT 攻城獅區</title>
	<atom:link href="https://sdt.hameba.tw/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>https://sdt.hameba.tw</link>
	<description>由Steven, Der, Ted 三位高級打字員所組成，是三位工程師(攻城獅)所維護的技術分享平台，或許偶爾會分享一些日常，有任何問題或是錯誤的部分，歡迎留言告訴我們！</description>
	<lastBuildDate>Thu, 16 Jul 2020 16:24:22 +0800</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.3</generator>

<image>
	<url>https://sdt.hameba.tw/wp-content/uploads/2020/02/hameba_favicon-150x150.png</url>
	<title>Java | SDT 攻城獅區</title>
	<link>https://sdt.hameba.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>JAVA讀取及寫入TXT檔案</title>
		<link>https://sdt.hameba.tw/641/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java%25e8%25ae%2580%25e5%258f%2596%25e5%258f%258a%25e5%25af%25ab%25e5%2585%25a5txt%25e6%25aa%2594%25e6%25a1%2588</link>
				<comments>https://sdt.hameba.tw/641/#respond</comments>
				<pubDate>Thu, 16 Jul 2020 16:24:22 +0000</pubDate>
		<dc:creator><![CDATA[Li Der]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=641</guid>
				<description><![CDATA[<p>練習用JAVA讀取及寫入TXT檔案，一併順手記錄下來。 會使用到BufferedReader跟FileRead &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/641/" class="more-link">閱讀全文<span class="screen-reader-text">〈JAVA讀取及寫入TXT檔案〉</span></a></p>
The post <a href="https://sdt.hameba.tw/641/">JAVA讀取及寫入TXT檔案</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>練習用JAVA讀取及寫入TXT檔案，一併順手記錄下來。</p>
<p>會使用到<span style="font-size: 1rem">BufferedReader跟</span><span style="font-size: 1rem">FileReader還有</span><span style="font-size: 1rem">FileWriter</span></p>
<p><span id="more-641"></span></p>
<p>先用一支程式來建立TXT檔，再來把這TXT檔案的內容寫到另一個新的文字檔</p><pre class="crayon-plain-tag">import java.io.FileWriter;

public class Write {
    public static void main(String[] args) {
        try {
            // Constructs a FileWriter object given a file name.
            FileWriter fw = new FileWriter("one.txt");
            fw.write("This is one!");
            fw.flush();
            fw.close();
        } catch (Exception e) {
            System.out.println("Something Error");
        }

    }
}</pre><p>編譯跟執行一下</p><pre class="crayon-plain-tag">javac Write.java
java -cp . Write</pre><p>就可以在目錄底下看到「one.txt」這個檔案</p>
<p>接下來就到我們的主題了，我們要把這檔案讀出來然後寫入到另一個檔案</p><pre class="crayon-plain-tag">import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;

public class ReadAndWrite {
    public static void main(String[] args) {
        try {
            // Creates a new FileReader, given the name of the file to read from.
            FileReader fr = new FileReader("one.txt");
            // Creates a buffering character-input stream that uses a default-sized input buffer.
            BufferedReader br = new BufferedReader(fr);
            String content = "";
            while (br.ready()) {
                content = br.readLine();
                System.out.println("Ready... read txt");
                System.out.println("-------------");
                System.out.println(content);
                System.out.println("-------------");
            }

            // Constructs a FileWriter object given a file name.
            FileWriter fw = new FileWriter("target.txt");
            fw.write(content);

            fw.flush();
            System.out.println("Write Complete!");
            // After used close.
            fr.close();
            fw.close();
        } catch (Exception e) {
            System.out.println("Something Error");
        }

    }
}</pre><p>編譯執行了之後，就會出現「target.txt」的檔案</p><pre class="crayon-plain-tag">javac ReadAndWrite.java 
java -cp . ReadAndWrite</pre><p>完成！</p>
<p>&nbsp;</p>
<p>之後有機會再分享讀取及寫入多行的方式。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://sdt.hameba.tw/641/">JAVA讀取及寫入TXT檔案</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/641/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Mac Java version switch, 版本管理</title>
		<link>https://sdt.hameba.tw/623/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mac-java-version-switch-%25e7%2589%2588%25e6%259c%25ac%25e7%25ae%25a1%25e7%2590%2586</link>
				<comments>https://sdt.hameba.tw/623/#respond</comments>
				<pubDate>Sat, 29 Feb 2020 08:16:08 +0000</pubDate>
		<dc:creator><![CDATA[Hsu Steven]]></dc:creator>
				<category><![CDATA[Other]]></category>
		<category><![CDATA[bash_profile]]></category>
		<category><![CDATA[brew]]></category>
		<category><![CDATA[brew cask]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[profile]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=623</guid>
				<description><![CDATA[<p>有時每個專案所運用到的Java版本不同，就會需要做到切換， Survey後有jenv這款管理，可以幫助切換，  &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/623/" class="more-link">閱讀全文<span class="screen-reader-text">〈Mac Java version switch, 版本管理〉</span></a></p>
The post <a href="https://sdt.hameba.tw/623/">Mac Java version switch, 版本管理</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>有時每個專案所運用到的Java版本不同，就會需要做到切換，</p>
<p>Survey後有jenv這款管理，可以幫助切換，<span id="more-623"></span></p>
<p>但作者提供另一種切換為 alias的方式，我認為比較方便</p>
<p>安裝Java</p><pre class="crayon-plain-tag">// 新增homebrew cask功能
$ brew tap homebrew/cask-versions

// 查詢Java版本
$ brew search java

// 安裝想要的java版本 (如選java會為當前最新版本)
$ brew cask install java

// 安裝完可以查詢
$ brew cask list</pre><p>設定快捷鍵</p><pre class="crayon-plain-tag">$ nano ~/.bash_profile
//在最下面新增以下內容，確定自己有的版本及alias快捷名稱
export JAVA_6_HOME=$(/usr/libexec/java_home -v1.6)
export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_11_HOME=$(/usr/libexec/java_home -v1.11)

alias java6=`export JAVA_HOME=$JAVA_6_HOME`
alias java8=`export JAVA_HOME=$JAVA_8_HOME`
alias java11=`export JAVA_HOME=$JAVA_11_HOME`

#default java8
export JAVA_HOME=$JAVA_8_HOME

//完成後儲存

// 重讀bash檔案
$ source ~/.bash_profile

//測試切換
$ java6
$ java11</pre><p>&nbsp;</p>
<p>Reference</p>
<p><a href="https://stackoverflow.com/questions/26252591/mac-os-x-and-multiple-java-versions" target="_blank" rel="noopener noreferrer">https://stackoverflow.com/questions/26252591/mac-os-x-and-multiple-java-versions</a></p>
<p><a href="https://blog.gtwang.org/mac-os-x/how-to-set-or-change-the-default-java-jdk-version-on-os-x/" target="_blank" rel="noopener noreferrer">https://blog.gtwang.org/mac-os-x/how-to-set-or-change-the-default-java-jdk-version-on-os-x/</a></p>The post <a href="https://sdt.hameba.tw/623/">Mac Java version switch, 版本管理</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/623/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Java syntax error on token enum 解決</title>
		<link>https://sdt.hameba.tw/598/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-syntax-error-on-token-enum-%25e8%25a7%25a3%25e6%25b1%25ba</link>
				<comments>https://sdt.hameba.tw/598/#respond</comments>
				<pubDate>Fri, 28 Feb 2020 14:25:49 +0000</pubDate>
		<dc:creator><![CDATA[Li Der]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=598</guid>
				<description><![CDATA[<p>在維護舊的專案，沒想到一編譯後就出現錯誤訊息了。 把訊息看清楚了之後，原來是該專案有個變數叫做 enum， 而 &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/598/" class="more-link">閱讀全文<span class="screen-reader-text">〈Java syntax error on token enum 解決〉</span></a></p>
The post <a href="https://sdt.hameba.tw/598/">Java syntax error on token enum 解決</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>在維護舊的專案，沒想到一編譯後就出現錯誤訊息了。</p>
<p>把訊息看清楚了之後，原來是該專案有個變數叫做 <span style="color: #ff0000">enum<span style="color: #000000">，</span></span></p>
<p><span id="more-598"></span></p>
<p>而這個變數在 Java 1.5 之後已經是保留字了，</p>
<p>所以會看到大概的錯誤訊息如下：</p>
<blockquote><p><strong>syntax error on token enum identifier expected &#8230;</strong></p></blockquote>
<p>解決的方式有兩個，一個是修改變數名稱，另一個是調整Compiler的版本。</p>
<p>preference -&gt; Java -&gt; Compiler -&gt; Compiler compliance level 改為 <span style="color: #ff0000"><strong>1.4</strong></span></p>
<p><img class="alignnone wp-image-599 size-large" src="https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4-1024x533.png" alt="" width="840" height="437" srcset="https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4-1024x533.png?v=1582899387 1024w, https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4-300x156.png?v=1582899387 300w, https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4-768x400.png?v=1582899387 768w, https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4-1200x624.png?v=1582899387 1200w, https://sdt.hameba.tw/wp-content/uploads/2020/02/compilerTo1.4.png?v=1582899387 1311w" sizes="(max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px" /></p>
<p>如果是維護舊專案，還是建議用第二種方式。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://sdt.hameba.tw/598/">Java syntax error on token enum 解決</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/598/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>JAVA取得本機實際IP位置</title>
		<link>https://sdt.hameba.tw/559/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java%25e5%258f%2596%25e5%25be%2597%25e6%259c%25ac%25e6%25a9%259f%25e5%25af%25a6%25e9%259a%259bip%25e4%25bd%258d%25e7%25bd%25ae</link>
				<comments>https://sdt.hameba.tw/559/#respond</comments>
				<pubDate>Thu, 27 Feb 2020 16:28:15 +0000</pubDate>
		<dc:creator><![CDATA[Hsu Steven]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[IP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring-boot]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=559</guid>
				<description><![CDATA[<p>先明確了解一些規則： 127.xxx.xxx.xxx 屬於&#8221;loopback&#8221; 地址， &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/559/" class="more-link">閱讀全文<span class="screen-reader-text">〈JAVA取得本機實際IP位置〉</span></a></p>
The post <a href="https://sdt.hameba.tw/559/">JAVA取得本機實際IP位置</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>先明確了解一些規則：</p>
<p>127.xxx.xxx.xxx 屬於&#8221;loopback&#8221; 地址，即只能你自己的本機可見，就是本機地址，比較常見的有127.0.0.1；</p>
<p><span id="more-559"></span><br />
192.168.xxx.xxx 屬於private 私有地址(site local address)，屬於本地組織內部訪問，只能在本地局域網可見。</p>
<p>同樣10.xxx.xxx.xxx、從172.16.xxx.xxx 到 172.31.xxx.xxx都是私有地址，也是屬於組織內部訪問；</p>
<p>169.254.xxx.xxx 屬於連接本地地址（link local IP），在單獨網段可用<br />
從224.xxx.xxx.xxx 到 239.xxx.xxx.xxx 屬於組播地址<br />
比較特殊的255.255.255.255 屬於廣播地址<br />
除此之外的地址就是點對點的可用的公開IPv4地址</p>
<p>本機實際IP位置的正確方式，可以參考以下，測試得到路由所配發的ip</p><pre class="crayon-plain-tag">package ipTest;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Enumeration;

public class Test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        InetAddress ip;
        try {
            // 正确的IP拿法
            System.out.println("get LocalHost LAN Address : " + getLocalHostLANAddress().getHostAddress());


        } catch (UnknownHostException e) {

            e.printStackTrace();

        }
    }

    // 正确的IP拿法，即优先拿site-local地址
    private static InetAddress getLocalHostLANAddress() throws UnknownHostException {
        try {
            InetAddress candidateAddress = null;
            // 遍历所有的网络接口
            for (Enumeration ifaces = NetworkInterface.getNetworkInterfaces(); ifaces.hasMoreElements();) {
                NetworkInterface iface = (NetworkInterface) ifaces.nextElement();
                // 在所有的接口下再遍历IP
                for (Enumeration inetAddrs = iface.getInetAddresses(); inetAddrs.hasMoreElements();) {
                    InetAddress inetAddr = (InetAddress) inetAddrs.nextElement();
                    if (!inetAddr.isLoopbackAddress()) {// 排除loopback类型地址
                        if (inetAddr.isSiteLocalAddress()) {
                            // 如果是site-local地址，就是它了
                            return inetAddr;
                        } else if (candidateAddress == null) {
                            // site-local类型的地址未被发现，先记录候选地址
                            candidateAddress = inetAddr;
                        }
                    }
                }
            }
            if (candidateAddress != null) {
                return candidateAddress;
            }
            // 如果没有发现 non-loopback地址.只能用最次选的方案
            InetAddress jdkSuppliedAddress = InetAddress.getLocalHost();
            if (jdkSuppliedAddress == null) {
                throw new UnknownHostException("The JDK InetAddress.getLocalHost() method unexpectedly returned null.");
            }
            return jdkSuppliedAddress;
        } catch (Exception e) {
            UnknownHostException unknownHostException = new UnknownHostException(
                    "Failed to determine LAN address: " + e);
            unknownHostException.initCause(e);
            throw unknownHostException;
        }
    }


}</pre><p>&nbsp;</p>
<p>Reference</p>
<p><a href="https://www.cnblogs.com/starcrm/p/7071227.html" target="_blank" rel="noopener noreferrer">https://www.cnblogs.com/starcrm/p/7071227.html</a></p>The post <a href="https://sdt.hameba.tw/559/">JAVA取得本機實際IP位置</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/559/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>VS Code 安裝 Java spring boot 環境</title>
		<link>https://sdt.hameba.tw/535/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=vs-code-%25e5%25ae%2589%25e8%25a3%259d-java-spring-boot-%25e7%2592%25b0%25e5%25a2%2583</link>
				<comments>https://sdt.hameba.tw/535/#respond</comments>
				<pubDate>Sat, 22 Feb 2020 15:32:34 +0000</pubDate>
		<dc:creator><![CDATA[Hsu Steven]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Gradle]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Spring-boot]]></category>
		<category><![CDATA[VS Code]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=535</guid>
				<description><![CDATA[<p>以往開發Java環境都會選用eclipse， 但我比較喜歡VS code的IDE開發工具， 所以找一下發現原來 &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/535/" class="more-link">閱讀全文<span class="screen-reader-text">〈VS Code 安裝 Java spring boot 環境〉</span></a></p>
The post <a href="https://sdt.hameba.tw/535/">VS Code 安裝 Java spring boot 環境</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>以往開發Java環境都會選用eclipse，</p>
<p>但我比較喜歡VS code的IDE開發工具，</p>
<p><span id="more-535"></span>所以找一下發現原來微軟也有把Java開發環境導入VS code，</p>
<p>以下是我MAC快速配置，</p>
<p>進入plugin 搜尋  <a href="https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack" target="_blank" rel="nofollow noopener noreferrer">Java Extension Pack</a>、<a href="https://marketplace.visualstudio.com/items?itemName=Pivotal.vscode-boot-dev-pack">Spring Boot Extension Pack</a>，</p>
<p>選擇安裝後，VS code開啟Java spring專案就會自動掃專案的內容，</p>
<p>這邊我就沒有特別設定, 引入jar資源，</p>
<p>假設有特別引入IBM or EAR資源的話，可以在專案.vscdoe/settings.json設定。</p>
<p>&nbsp;</p>
<p>Reference</p>
<p><a href="https://zhuanlan.zhihu.com/p/54358113" target="_blank" rel="noopener noreferrer">https://zhuanlan.zhihu.com/p/54358113</a></p>The post <a href="https://sdt.hameba.tw/535/">VS Code 安裝 Java spring boot 環境</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/535/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Java 利用 method 判斷日期區間</title>
		<link>https://sdt.hameba.tw/341/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java-%25e5%2588%25a9%25e7%2594%25a8-method-%25e5%2588%25a4%25e6%2596%25b7%25e6%2597%25a5%25e6%259c%259f%25e5%258d%2580%25e9%2596%2593</link>
				<comments>https://sdt.hameba.tw/341/#respond</comments>
				<pubDate>Fri, 20 Dec 2019 11:43:24 +0000</pubDate>
		<dc:creator><![CDATA[Hsu Steven]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Date]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=341</guid>
				<description><![CDATA[<p>通常APP活動期間顯示活動按鈕都會透過後台給予某值Ture or False， 所以可以寫個method快速判 &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/341/" class="more-link">閱讀全文<span class="screen-reader-text">〈Java 利用 method 判斷日期區間〉</span></a></p>
The post <a href="https://sdt.hameba.tw/341/">Java 利用 method 判斷日期區間</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>通常APP活動期間顯示活動按鈕都會透過後台給予某值Ture or False，</p>
<p>所以可以寫個method快速判斷</p>
<p><span id="more-341"></span></p>
<p>method 如下</p><pre class="crayon-plain-tag">/** 
* @Title: isInDate 
* @Description: 判斷一個時間段（YYYY-MM-DD）是否在一個區間 
* @param @param date
* @param @param strDateBegin
* @param @param strDateEnd
* @param @return    設定文件 
* @return boolean    返回類型 
* @throws 
*/

public static boolean isInDate(Date date, String strDateBegin,String strDateEnd) {  
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd",Locale.ENGLISH);  
    String strDate = sdf.format(date);   //2019-12-20
    // 截取當前時間年月日 轉成整型
    int  tempDate=Integer.parseInt(strDate.split("-")[0]+strDate.split("-")[1]+strDate.split("-")[2]);  
    // 截取開始時間年月日 轉成整型
    int  tempDateBegin=Integer.parseInt(strDateBegin.split("-")[0]+strDateBegin.split("-")[1]+strDateBegin.split("-")[2]);  
    // 截取結束時間年月日   轉成整型
    int  tempDateEnd=Integer.parseInt(strDateEnd.split("-")[0]+strDateEnd.split("-")[1]+strDateEnd.split("-")[2]);

    if ((tempDate &gt;= tempDateBegin &amp;&amp; tempDate &lt;= tempDateEnd)) {  
        return true;  
    } else {  
        return false;  
    }  
}</pre><p>如何使用</p><pre class="crayon-plain-tag">String startDate = "2019-01-01"
String endDate = "2019-12-31"

if(isInDate(new Date(), startDate, endDate)){
    .
    .
    /*回傳顯示活動按鈕*/
    .
    .
}</pre><p>&nbsp;</p>
<p>Reference</p>
<p><a href="https://blog.csdn.net/Smile_Miracle/article/details/70102262">https://blog.csdn.net/Smile_Miracle/article/details/70102262</a></p>The post <a href="https://sdt.hameba.tw/341/">Java 利用 method 判斷日期區間</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/341/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
		<item>
		<title>Java經過ProxyPass獲取正確客戶端真實IP方法</title>
		<link>https://sdt.hameba.tw/287/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=java%25e7%25b6%2593%25e9%2581%258eproxypass%25e7%258d%25b2%25e5%258f%2596%25e6%25ad%25a3%25e7%25a2%25ba%25e5%25ae%25a2%25e6%2588%25b6%25e7%25ab%25af%25e7%259c%259f%25e5%25af%25a6ip%25e6%2596%25b9%25e6%25b3%2595</link>
				<comments>https://sdt.hameba.tw/287/#respond</comments>
				<pubDate>Sun, 08 Dec 2019 04:38:53 +0000</pubDate>
		<dc:creator><![CDATA[Hsu Steven]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[getRemoteAddr]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ProxyPass]]></category>
		<category><![CDATA[X-Forwarded-For]]></category>

		<guid isPermaLink="false">https://sdt.hameba.tw/?p=287</guid>
				<description><![CDATA[<p>通常做好AP Server後，會有一台Web Server做Proxypass代理減少附載平衡 但是通常經過一 &#8230; </p>
<p class="link-more"><a href="https://sdt.hameba.tw/287/" class="more-link">閱讀全文<span class="screen-reader-text">〈Java經過ProxyPass獲取正確客戶端真實IP方法〉</span></a></p>
The post <a href="https://sdt.hameba.tw/287/">Java經過ProxyPass獲取正確客戶端真實IP方法</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></description>
								<content:encoded><![CDATA[<p>通常做好AP Server後，會有一台Web Server做Proxypass代理減少附載平衡</p>
<p>但是通常經過一層之後，request header也就會有改變，</p>
<p><span id="more-287"></span></p>
<p>造成AP得到的getRemoteAddr都是Web Server的ip</p>
<p>所以Java攔截器層可以增加以下方式來記錄真實Client IP</p><pre class="crayon-plain-tag">public static String getIpAddress(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }
    if (ip.contains(",")) {
        return ip.split(",")[0];
    } else {
        return ip;
    }
}</pre><p><strong>Request Header參數說明</strong></p>
<ul>
<li>X-Forwarded-For</li>
</ul>
<p>這是一個 Squid 開發的字段，只有在通過了HTTP代理或者負載均衡服務器時才會添加該項。</p>
<p>格式為X-Forwarded-For:client1,proxy1,proxy2，一般情況下，第一個ip為客戶端真實ip，後面的為經過的代理服務器ip。現在大部分的代理都會加上這個請求頭。</p>
<ul>
<li>Proxy-Client-IP/WL- Proxy-Client-IP</li>
</ul>
<p>這個一般是經過apache http服務器的請求才會有，用apache http做代理時一般會加上Proxy-Client-IP請求頭，而WL-Proxy-Client-IP是他的weblogic插件加上的頭。</p>
<ul>
<li>HTTP_CLIENT_IP</li>
</ul>
<p>有些代理服務器會加上此請求頭。</p>
<ul>
<li>X-Real-IP<br />
nginx代理一般會加上此請求頭。</li>
</ul>
<p>Reference</p>
<p><a href="https://www.itread01.com/content/1532062937.html">https://www.itread01.com/content/1532062937.html</a></p>
<div id="gtx-trans">
<div class="gtx-trans-icon"></div>
</div>The post <a href="https://sdt.hameba.tw/287/">Java經過ProxyPass獲取正確客戶端真實IP方法</a> first appeared on <a href="https://sdt.hameba.tw">SDT 攻城獅區</a>.]]></content:encoded>
							<wfw:commentRss>https://sdt.hameba.tw/287/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
							</item>
	</channel>
</rss>
