The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          #

               摘要: JDK本身提供了很多方便的JVM性能調優監控工具,除了集成式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起拋磚引玉之用,讓大家能開始對JVM性能調優的常用工具有所了解。    現實企業級Java開發中,有時候我們會碰到下面這些問題:OutOfMemoryError,內存不足內存泄露線程死鎖鎖爭用(Lo...  閱讀全文
          posted @ 2015-03-20 09:46 Eric_jiang 閱讀(1989) | 評論 (1)編輯 收藏

          首先我們先介紹一下為什么要讓 Apache 與 Tomcat 之間進行連接。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務默認的端口是 8080,裝好 tomcat 后通過 8080 端口可以直接使用 Tomcat 所運行的應用程序,你也可以將該端口改為 80。

          既然 Tomcat 本身已經可以提供這樣的服務,我們為什么還要引入 Apache 或者其他的一些專門的 HTTP 服務器呢?原因有下面幾個:

          1. 提升對靜態文件的處理性能

          2. 利用 Web 服務器來做負載均衡以及容錯

          3. 無縫的升級應用程序

          這三點對一個 web 網站來說是非常之重要的,我們希望我們的網站不僅是速度快,而且要穩定,不能因為某個 Tomcat 宕機或者是升級程序導致用戶訪問不了,而能完成這幾個功能的、最好的 HTTP 服務器也就只有 apache 的 http server 了,它跟 tomcat 的結合是最緊密和可靠的。

          接下來我們介紹三種方法將 apache 和 tomcat 整合在一起。

          JK

          這是最常見的方式,你可以在網上找到很多關于配置JK的網頁,當然最全的還是其官方所提供的文檔。JK 本身有兩個版本分別是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已經廢棄了,以后不再有新版本的推出了,所以建議你采用版本 1。

          JK 是通過 AJP 協議與 Tomcat 服務器進行通訊的,Tomcat 默認的 AJP Connector 的端口是 8009。JK 本身提供了一個監控以及管理的頁面 jkstatus,通過 jkstatus 可以監控 JK 目前的工作狀態以及對到 tomcat 的連接進行設置,如下圖所示:

          圖 1:監控以及管理的頁面 jkstatus
          圖 1:監控以及管理的頁面 jkstatus

          在這個圖中我們可以看到當前JK配了兩個連接分別到 8109 和 8209 端口上,目前 s2 這個連接是停止狀態,而 s1 這個連接自上次重啟后已經處理了 47 萬多個請求,流量達到 6.2 個 G,最大的并發數有 13 等等。我們也可以利用 jkstatus 的管理功能來切換 JK 到不同的 Tomcat 上,例如將 s2 啟用,并停用 s1,這個在更新應用程序的時候非常有用,而且整個切換過程對用戶來說是透明的,也就達到了無縫升級的目的。關于 JK 的配置文章網上已經非常多了,這里我們不再詳細的介紹整個配置過程,但我要講一下配置的思路,只要明白了配置的思路,JK 就是一個非常靈活的組件。

          JK 的配置最關鍵的有三個文件,分別是

          httpd.conf 
          Apache 服務器的配置文件,用來加載 JK 模塊以及指定 JK 配置文件信息

          workers.properties
          到 Tomcat 服務器的連接定義文件

          uriworkermap.properties
          URI 映射文件,用來指定哪些 URL 由 Tomcat 處理,你也可以直接在 httpd.conf 中配置這些 URI,但是獨立這些配置的好處是 JK 模塊會定期更新該文件的內容,使得我們修改配置的時候無需重新啟動 Apache 服務器。

          其中第二、三個配置文件名都可以自定義。下面是一個典型的 httpd.conf 對 JK 的配置

          # (httpd.conf) # 加載 mod_jk 模塊 LoadModule jk_module modules/mod_jk.so  # # Configure mod_jk #  JkWorkersFile conf/workers.properties JkMountFile conf/uriworkermap.properties JkLogFile logs/mod_jk.log JkLogLevel warn

          接下來我們在 Apache 的 conf 目錄下新建兩個文件分別是 workers.properties、uriworkermap.properties。這兩個文件的內容大概如下

          # # workers.properties #   # list the workers by name  worker.list=DLOG4J, status  # localhost server 1 # ------------------------ worker.s1.port=8109 worker.s1.host=localhost worker.s1.type=ajp13  # localhost server 2 # ------------------------ worker.s2.port=8209 worker.s2.host=localhost worker.s2.type=ajp13 worker.s2.stopped=1  worker.DLOG4J.type=lb worker.retries=3 worker.DLOG4J.balanced_workers=s1, s2 worker.DLOG4J.sticky_session=1  worker.status.type=status

          以上的 workers.properties 配置就是我們前面那個屏幕抓圖的頁面所用的配置。首先我們配置了兩個類型為 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺服務器上運行在兩個不同端口 8109 和 8209 的 Tomcat 上。接下來我們配置了一個類型為 lb(也就是負載均衡的意思)的 worker,它的名字是 DLOG4J,這是一個邏輯的 worker,它用來管理前面配置的兩個物理連接 s1 和 s2。最后還配置了一個類型為 status 的 worker,這是用來監控 JK 本身的模塊。有了這三個 worker 還不夠,我們還需要告訴 JK,哪些 worker 是可用的,所以就有 worker.list = DLOG4J, status 這行配置。

          接下來便是 URI 的映射配置了,我們需要指定哪些鏈接是由 Tomcat 處理的,哪些是由 Apache 直接處理的,看看下面這個文件你就能明白其中配置的意義

          /*=DLOG4J /jkstatus=status  !/*.gif=DLOG4J !/*.jpg=DLOG4J !/*.png=DLOG4J !/*.css=DLOG4J !/*.js=DLOG4J !/*.htm=DLOG4J !/*.html=DLOG4J

          相信你已經明白了一大半了:所有的請求都由 DLOG4J 這個 worker 進行處理,但是有幾個例外,/jkstatus 請求由 status 這個 worker 處理。另外這個配置中每一行數據前面的感嘆號是什么意思呢?感嘆號表示接下來的 URI 不要由 JK 進行處理,也就是 Apache 直接處理所有的圖片、css 文件、js 文件以及靜態 html 文本文件。

          通過對 workers.properties 和 uriworkermap.properties 的配置,可以有各種各樣的組合來滿足我們前面提出對一個 web 網站的要求。您不妨動手試試!

          回頁首

          http_proxy

          這是利用 Apache 自帶的 mod_proxy 模塊使用代理技術來連接 Tomcat。在配置之前請確保是否使用的是 2.2.x 版本的 Apache 服務器。因為 2.2.x 版本對這個模塊進行了重寫,大大的增強了其功能和穩定性。

          http_proxy 模式是基于 HTTP 協議的代理,因此它要求 Tomcat 必須提供 HTTP 服務,也就是說必須啟用 Tomcat 的 HTTP Connector。一個最簡單的配置如下

          ProxyPass /images ! ProxyPass /css ! ProxyPass /js ! ProxyPass / http://localhost:8080/

          在這個配置中,我們把所有 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是 Tomcat 的訪問地址,除了 images、css、js 幾個目錄除外。我們同樣可以利用 mod_proxy 來做負載均衡,再看看下面這個配置

          ProxyPass /images ! ProxyPass /css !  ProxyPass /js !  ProxyPass / balancer://example/ <Proxy balancer://example/> BalancerMember http://server1:8080/ BalancerMember http://server2:8080/ BalancerMember http://server3:8080/ </Proxy>

          配置比 JK 簡單多了,而且它也可以通過一個頁面來監控集群運行的狀態,并做一些簡單的維護設置。

          圖 2:監控集群運行狀態
          圖 2:監控集群運行狀態

          回頁首

          ajp_proxy

          ajp_proxy 連接方式其實跟 http_proxy 方式一樣,都是由 mod_proxy 所提供的功能。配置也是一樣,只需要把 http:// 換成 ajp:// ,同時連接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改為:

          ProxyPass /images ! ProxyPass /css !  ProxyPass /js !  ProxyPass / balancer://example/ <Proxy balancer://example/> BalancerMember ajp://server1:8080/ BalancerMember ajp://server2:8080/ BalancerMember ajp://server3:8080/ </Proxy>

          采用 proxy 的連接方式,需要在 Apache 上加載所需的模塊,mod_proxy 相關的模塊有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式則需要加載 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 則需要加載 mod_proxy.so 和 mod_proxy_ajp.so這兩個模塊。

          回頁首

          三者比較

          相對于 JK 的連接方式,后兩種在配置上是比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言就不像 JK 這樣久經考驗,畢竟 Apache 2.2.3 推出的時間并不長,采用這種連接方式的網站還不多,因此,如果是應用于關鍵的互聯網網站,還是建議采用 JK 的連接方式。

          posted @ 2015-03-19 17:35 Eric_jiang 閱讀(235) | 評論 (0)編輯 收藏

          有段時間沒用maven了,最近使用maven下載jar包時速度緩慢,最初以為是自己網速的問題,后來確定是訪問maven的central repository端速度緩慢。在網上找到了一個maven repository的中國鏡像,速度相當不錯。特此收藏。


              

          <mirror>
          
                <id>CN</id>
                <name>OSChina Central</name>                                                                                                                       
                <url>http://maven.oschina.net/content/groups/public/</url>
                <mirrorOf>central</mirrorOf>
          
              </mirror>
          
          ========================================================
          
          OSChina Maven 庫使用幫助
          
          
          ==================其他maven倉庫鏡像==========================
          
          <mirror>  
                <id>repo2</id>  
                <mirrorOf>central</mirrorOf>  
                <name>Human Readable Name for this Mirror.</name>  
                <url>http://repo2.maven.org/maven2/</url>  
          </mirror>  
          <mirror>  
                <id>net-cn</id>  
                <mirrorOf>central</mirrorOf>  
                <name>Human Readable Name for this Mirror.</name>  
                <url>http://maven.net.cn/content/groups/public/</url>   
          </mirror>  
          <mirror>  
                <id>ui</id>  
                <mirrorOf>central</mirrorOf>  
                <name>Human Readable Name for this Mirror.</name>  
               <url>http://uk.maven.org/maven2/</url>  
          </mirror>  
          <mirror>  
                <id>ibiblio</id>  
                <mirrorOf>central</mirrorOf>  
                <name>Human Readable Name for this Mirror.</name>  
               <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>  
          </mirror>  
          <mirror>  
                <id>jboss-public-repository-group</id>  
                <mirrorOf>central</mirrorOf>  
                <name>JBoss Public Repository Group</name>  
               <url>http://repository.jboss.org/nexus/content/groups/public</url>  
          </mirror>

          <mirror>  
                <id>JBossJBPM</id> 
              <mirrorOf>central</mirrorOf>
              <name>JBossJBPM Repository</name>
              <url>
          https://repository.jboss.org/nexus/content/repositories/releases/</url>
          </mirror>


          posted @ 2015-03-17 21:28 Eric_jiang 閱讀(336) | 評論 (0)編輯 收藏

          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.memcached%E6%95%99%E7%A8%8B%E7%AE%80%E4%BB%8B.doc|12288|21dd20b6b1698cde2d3a60558b9cebf5|h=pfwxrfmggemvtxc4p3vnzzzj55k7ynqm|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcachedPPT.zip|994215|2f01ba03d0d09dc44b4b4a1f608169eb|h=myt736l66y4p3ihfuvgaqweigjyjukpx|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached%E6%BA%90%E7%A0%81.zip|10172|6cc7b73dae59c1d8a7eb18706f8fc7b9|h=5xsecbbhavpglk7yczwvvt2dlhfolete|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached.%E7%AC%94%E8%AE%B0.zip|328142|6552298f2cc63604b6f7fa873a417869|h=gg3beg7xxtnqoqjbxd3feqdui4axabt6|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached.%E8%BD%AF%E4%BB%B6%E8%B5%84%E6%96%99.zip|33458096|871b67a5634c9a2caf8d1dd937160df0|h=6epszrrx4vfhnvpmtkzwf5qgux7437gx|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached01.%E5%8E%9F%E7%90%86%E4%BB%8B%E7%BB%8D.wmv|33671725|93565e481da4e7f8002d2b11910fa00c|h=tx27z622spyvpmvnwi5jnmkoswibfokx|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached02.%E5%AE%89%E8%A3%85%E6%BC%94%E7%A4%BA.wmv|21819537|ac9f25585c528c75bcc34a84c52d343e|h=vn35qfid546gkrgb5g4xl6p7ciicbm4x|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached03.telnet%E6%93%8D%E4%BD%9Cmemcached.wmv|56558957|c955905ad064cc0b6f0a56b162045148|h=5ia2w2joekfwrdopy2kst64ijv6gmae6|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached04.PHP%E6%93%8D%E4%BD%9Cmemcached%28%E4%B8%80%29.wmv|52222153|5a1db437311f8061417794641d30606c|h=x3vxrnxv6dmcyqu5se2gk7eforpfcl5y|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached05.PHP%E6%93%8D%E4%BD%9Cmemcached%28%E4%BA%8C%29.wmv|40405343|a8969de7049006e9285caa2f70ca2387|h=rosywm4vfzjbijf7hgckirxbzouzrypf|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached06.PHP%E6%93%8D%E4%BD%9Cmemcached%28%E4%B8%89%29.wmv|40067193|ca146dd6ac27220c9069d45cf75908ac|h=vie3pw4vghyw6vkxkffabc62avzjqazt|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached07.PHP%E6%93%8D%E4%BD%9Cmemcached%28%E5%9B%9B%29.wmv|40067193|7b7f2b1adc84890c86a11ce9c9616356|h=mfonhchuvmklq4yiy7x522d4knnf2o7q|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached08.%E5%88%86%E5%B8%83%E5%BC%8Fmemcached.wmv|61955937|4623b853f834b72f422206a9e61cfe56|h=yzzzcrmktvt42do3dnos7nd3mudwf4cs|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached09.session%E5%85%A5memcached.wmv|92855105|ab19290a975de96197913ae1bcb5c3ee|h=z2wv6s3ta2ao4yikokgigjqmstxa6qim|/
          ed2k://|file|%E4%BC%A0%E6%99%BA%E6%92%AD%E5%AE%A2PHP%E5%9F%B9%E8%AE%AD.%E7%AC%AC%E4%BA%8C%E7%89%88PHP%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B.%E9%9F%A9%E9%A1%BA%E5%B9%B3.%E5%A4%A7%E5%9E%8B%E9%97%A8%E6%88%B7%E7%BD%91%E7%AB%99%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF-memcached10.%E5%AE%89%E5%85%A8%E8%AE%A8%E8%AE%BA.wmv|31039265|e82848f5cae1d44774ad17ddd5fe90e5|h=kxxf76z4q5xphf26y64i6wp7wb4zjmqf|/

           
          posted @ 2015-03-15 20:26 Eric_jiang 閱讀(617) | 評論 (0)編輯 收藏

           有關tomcat 6.0如何配置https服務的文章可以參考:http://blog.csdn.net/zhou_zion/article/details/6759171
          以下主要講解如何使用https發起post請求:
          參考文檔:梁棟前輩的《Java加密與解密的藝術》
          [java] view plaincopy
          import java.io.BufferedReader;  
          import java.io.FileInputStream;  
          import java.io.IOException;  
          import java.io.InputStreamReader;  
          import java.net.MalformedURLException;  
          import java.net.URL;  
          import java.security.GeneralSecurityException;  
          import java.security.KeyStore;  
            
          import javax.net.ssl.HostnameVerifier;  
          import javax.net.ssl.HttpsURLConnection;  
          import javax.net.ssl.KeyManagerFactory;  
          import javax.net.ssl.SSLContext;  
          import javax.net.ssl.TrustManagerFactory;  
            
          public class HttpsPost {  
              /** 
               * 獲得KeyStore. 
               * @param keyStorePath 
               *            密鑰庫路徑 
               * @param password 
               *            密碼 
               * @return 密鑰庫 
               * @throws Exception 
               */  
              public static KeyStore getKeyStore(String password, String keyStorePath)  
                      throws Exception {  
                  // 實例化密鑰庫  
                  KeyStore ks = KeyStore.getInstance("JKS");  
                  // 獲得密鑰庫文件流  
                  FileInputStream is = new FileInputStream(keyStorePath);  
                  // 加載密鑰庫  
                  ks.load(is, password.toCharArray());  
                  // 關閉密鑰庫文件流  
                  is.close();  
                  return ks;  
              }  
            
              /** 
               * 獲得SSLSocketFactory. 
               * @param password 
               *            密碼 
               * @param keyStorePath 
               *            密鑰庫路徑 
               * @param trustStorePath 
               *            信任庫路徑 
               * @return SSLSocketFactory 
               * @throws Exception 
               */  
              public static SSLContext getSSLContext(String password,  
                      String keyStorePath, String trustStorePath) throws Exception {  
                  // 實例化密鑰庫  
                  KeyManagerFactory keyManagerFactory = KeyManagerFactory  
                          .getInstance(KeyManagerFactory.getDefaultAlgorithm());  
                  // 獲得密鑰庫  
                  KeyStore keyStore = getKeyStore(password, keyStorePath);  
                  // 初始化密鑰工廠  
                  keyManagerFactory.init(keyStore, password.toCharArray());  
            
                  // 實例化信任庫  
                  TrustManagerFactory trustManagerFactory = TrustManagerFactory  
                          .getInstance(TrustManagerFactory.getDefaultAlgorithm());  
                  // 獲得信任庫  
                  KeyStore trustStore = getKeyStore(password, trustStorePath);  
                  // 初始化信任庫  
                  trustManagerFactory.init(trustStore);  
                  // 實例化SSL上下文  
                  SSLContext ctx = SSLContext.getInstance("TLS");  
                  // 初始化SSL上下文  
                  ctx.init(keyManagerFactory.getKeyManagers(),  
                          trustManagerFactory.getTrustManagers(), null);  
                  // 獲得SSLSocketFactory  
                  return ctx;  
              }  
            
              /** 
               * 初始化HttpsURLConnection. 
               * @param password 
               *            密碼 
               * @param keyStorePath 
               *            密鑰庫路徑 
               * @param trustStorePath 
               *            信任庫路徑 
               * @throws Exception 
               */  
              public static void initHttpsURLConnection(String password,  
                      String keyStorePath, String trustStorePath) throws Exception {  
                  // 聲明SSL上下文  
                  SSLContext sslContext = null;  
                  // 實例化主機名驗證接口  
                  HostnameVerifier hnv = new MyHostnameVerifier();  
                  try {  
                      sslContext = getSSLContext(password, keyStorePath, trustStorePath);  
                  } catch (GeneralSecurityException e) {  
                      e.printStackTrace();  
                  }  
                  if (sslContext != null) {  
                      HttpsURLConnection.setDefaultSSLSocketFactory(sslContext  
                              .getSocketFactory());  
                  }  
                  HttpsURLConnection.setDefaultHostnameVerifier(hnv);  
              }  
            
              /** 
               * 發送請求. 
               * @param httpsUrl 
               *            請求的地址 
               * @param xmlStr 
               *            請求的數據 
               */  
              public static void post(String httpsUrl, String xmlStr) {  
                  HttpsURLConnection urlCon = null;  
                  try {  
                      urlCon = (HttpsURLConnection) (new URL(httpsUrl)).openConnection();  
                      urlCon.setDoInput(true);  
                      urlCon.setDoOutput(true);  
                      urlCon.setRequestMethod("POST");  
                      urlCon.setRequestProperty("Content-Length",  
                              String.valueOf(xmlStr.getBytes().length));  
                      urlCon.setUseCaches(false);  
                      //設置為gbk可以解決服務器接收時讀取的數據中文亂碼問題  
                      urlCon.getOutputStream().write(xmlStr.getBytes("gbk"));  
                      urlCon.getOutputStream().flush();  
                      urlCon.getOutputStream().close();  
                      BufferedReader in = new BufferedReader(new InputStreamReader(  
                              urlCon.getInputStream()));  
                      String line;  
                      while ((line = in.readLine()) != null) {  
                          System.out.println(line);  
                      }  
                  } catch (MalformedURLException e) {  
                      e.printStackTrace();  
                  } catch (IOException e) {  
                      e.printStackTrace();  
                  } catch (Exception e) {  
                      e.printStackTrace();  
                  }  
              }  
            
              /** 
               * 測試方法. 
               * @param args 
               * @throws Exception 
               */  
              public static void main(String[] args) throws Exception {  
                  // 密碼  
                  String password = "123456";  
                  // 密鑰庫  
                  String keyStorePath = "tomcat.keystore";  
                  // 信任庫  
                  String trustStorePath = "tomcat.keystore";  
                  // 本地起的https服務  
                  String httpsUrl = "https://localhost:8443/service/httpsPost";  
                  // 傳輸文本  
                  String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><fruitShop><fruits><fruit><kind>蘿卜</kind></fruit><fruit><kind>菠蘿</kind></fruit></fruits></fruitShop>";  
                  HttpsPost.initHttpsURLConnection(password, keyStorePath, trustStorePath);  
                  // 發起請求  
                  HttpsPost.post(httpsUrl, xmlStr);  
              }  
          }  
          posted @ 2015-03-08 14:13 Eric_jiang 閱讀(356) | 評論 (0)編輯 收藏

          首先,WAS用IBM JSSE,不支持Sun JSSE,有文檔說明。
          http://www-01.ibm.com/support/docview.wss?uid=swg21418924

          然后,你要檢查 
          1) WAS\java\jre\lib\security\java.security, 看看secrity provider list里是否有Sun JSSE

          # List of providers and their preference orders (see above):
          #
          #security.provider.1=com.ibm.crypto.fips.provider.IBMJCEFIPS
          security.provider.1=com.ibm.crypto.provider.IBMJCE
          security.provider.2=com.ibm.jsse.IBMJSSEProvider
          security.provider.3=com.ibm.jsse2.IBMJSSEProvider2
          security.provider.4=com.ibm.security.jgss.IBMJGSSProvider
          security.provider.5=com.ibm.security.cert.IBMCertPath
          security.provider.6=com.ibm.crypto.pkcs11impl.provider.IBMPKCS11Impl
          security.provider.7=com.ibm.security.cmskeystore.CMSProvider
          security.provider.8=com.ibm.security.jgss.mech.spnego.IBMSPNEGO
          security.provider.9=com.ibm.security.sasl.IBMSASL
          security.provider.10=com.ibm.xml.crypto.IBMXMLCryptoProvider
          security.provider.11=com.ibm.xml.enc.IBMXMLEncProvider
          security.provider.12=org.apache.harmony.security.provider.PolicyProvider

          2) 類路徑里是否有Sun JSSE 的jar包

          3)你的代碼里是否有調用Sun JSSE provider
          posted @ 2015-03-08 14:02 Eric_jiang 閱讀(1134) | 評論 (0)編輯 收藏

          摘要導讀:

          更新20141120: 我始終對修改生產上weblogic上的配置文件這一方法心存擔憂(生產上的服務器不允許隨便修改,可能會影響到其他應用),所以想使用代碼的方式解決此問題,在對方法一失敗原因進行了進一步查看,日志打出來的的異常信息為如下: com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection 在網上搜索之后,并經過自己的判斷,發現我在new URL時傳的是com.sun.net.ssl.interna...

          更新20141120:

          我始終對修改生產上weblogic上的配置文件這一方法心存擔憂(生產上的服務器不允許隨便修改,可能會影響到其他應用),所以想使用代碼的方式解決此問題,在對方法一失敗原因進行了進一步查看,日志打出來的的異常信息為如下:

          com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl cannot be cast to javax.net.ssl.HttpsURLConnection

          在網上搜索之后,并經過自己的判斷,發現我在new URL時傳的是com.sun.net.ssl.internal.www.protocol.https.Handler這個handler,而報錯信息是javax.net.ssl這個包下面的,再看我的代碼:

           

          package java.net.HttpURLConnection;httpURLConnection = (HttpURLConnection) this.url.openConnection();

           

          這就說明了這兩個類不在一個包下面,仔細看了別人的回復,不難發現,這兩個類(HttpsURLConnectionOldImpl、HttpsURLConnection)屬于不同的包,看到這個貼子最下面(http://bbs.csdn.net/topics/380110416)有一個說明,Handler使用錯誤,我一看就知道這是問題的關鍵點,果斷修改前面方法一使用的handler: com.sun.net.ssl.internal.www.protocol.https.Handler,改為:sun.net.www.protocol.https.Handler,完整代碼如下:

          this.url =newURL(null, url,newsun.net.www.protocol.https.Handler());

          重新啟動后再次進行調試成功,自此證明,方法一也是有效的,不過對于使用別人的API jar包的不是很方便,我現在使用的辦法是將別人的代碼進行重寫,再調用自己寫的類解決問題,修改weblogic的配置文件生產上不好修改,只能用代碼實現了。

          --------------------------------------分割線20141119------------------------------------------

          Weblogic問題解決:

          在進行調試時,本地(TOMCAT)開發完成,并本地測試通過,但是部署至Weblogic上時,出現以下異常信息:

          weblogic.net.http.SOAPHttpsURLConnection incompatible with javax.net.ssl.HttpsURLConnection

          在網上搜索之后,發現是由于在weblogic上使用HttpsURLConniection時,會默認使用weblogic自己的類weblogic.net.http.SOAPHttpsURLConnection,導致出現問題:

          http://bbs.csdn.net/topics/380076374

          http://luanxiyuan.iteye.com/blog/1808097

          http://www.xuebuyuan.com/593657.html

          按照上面的貼子找到解決辦法:

          • 1. 按照網上的辦法,可以修改代碼解決問題,但是由于我們使用的是別人的jar包,不能修改代碼,:

           

          URL url = new URL(null,"https://www.etrade.com",new com.sun.net.ssl.internal.www.protocol.https.Handler());// 指定了handler后openConnection()返回了HttpsURLConnection類型對象HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

           

          • 2. 配置weblogic,在startWeblogic.sh文件中添加參數:-DUseSunHttpHandler=true,我最終添加了一行:MEM_ARGS="${MEM_ARGS} -DUseSunHttpHandler=true"

              

          以上兩個方法,方法一嘗試了之后,直接導致weblogic有異常但是沒有報錯信息,在開發、測試環境無法調查,debug也沒用;無奈只能選用第二種方法,配置參數后,成功配置,并測試成功;

           

          總結:方法一我嘗試過幾種方法,均失敗,有用的還是只有第二種方法,如有其他可以使用的方法,歡迎大家推薦

          posted @ 2015-03-08 13:05 Eric_jiang 閱讀(2031) | 評論 (1)編輯 收藏

          在開發時,有時候可能需要根據不同的環境設置不同的系統參數,我們都知道,在使用java -jar命令時可以使用-D參數來設置運行時的系統變量,同樣,在Eclipse中運行java程序時,我們怎么設置該系統變量呢?

           

          另外,如果我們的程序需要輸入運行參數,在Eclipse中如何配置?

          答案很簡單,具體步驟為:

          在要運行的類上右鍵點擊Run As-->Run Configurations...

          在彈出界面中點擊Arguments

          然后彈出如下界面:

          1.其中Program arguments欄里可以輸入程序運行所需的參數,也就是main方法的參數,如果參數為多個,則用空格分開。

          2.VM arguments里接收的是系統變量參數,系統變量輸入格式為:-Dargname=argvalue,同樣,多個參數之間用空格隔開。另外如果參數值中間有空格,則用引號括起來

          示例程序代碼如下:

          Java代碼  收藏代碼
          1. /** 
          2.  * ClassName: Main <br/> 
          3.  * Function: Eclipse系統變量和運行參數. <br/> 
          4.  * date: 2013-8-27 下午04:06:09 <br/> 
          5.  * 
          6.  * @author chenzhou1025@126.com 
          7.  * @version  
          8.  */  
          9. public class Main {  
          10.     public static void main(String[] args){  
          11.         System.out.println("打印所有的參數:");  
          12.         if(args.length>0){  
          13.             for(int i=0;i<args.length;i++){  
          14.                 System.out.println("第"+i+"個參數為:"+args[i]);  
          15.             }  
          16.         }  
          17.         System.out.println("打印系統變量:");  
          18.         String env = System.getProperty("service.env");  
          19.         System.out.println("service.env:"+env);  
          20.         String logpath = System.getProperty("logfile.path");  
          21.         System.out.println("logfile.path:"+logpath);  
          22.     }  
          23. }  

          運行程序,控制臺輸出如下:

          Console代碼  收藏代碼
          1. 打印所有的參數:  
          2. 0個參數為:chenzhou  
          3. 1個參數為:chenzhou2  
          4. 2個參數為:chenzhou3  
          5. 打印系統變量:  
          6. service.env:DEV  
          7. logfile.path:E:\u03\project\logs  

           

          posted @ 2015-03-08 13:03 Eric_jiang 閱讀(163) | 評論 (0)編輯 收藏

          Mac下面除了用dmg、pkg來安裝軟件外,比較方便的還有用MacPorts來幫助你安裝其他應用程序,跟BSD中的ports道理一樣。MacPorts就像apt-get、yum一樣,可以快速安裝些軟件。

          下面將MacPorts的安裝和使用方法記錄在這里以備查。

          訪問官方網站http://www.macports.org/install.php,這里提供有dmg安裝和源碼安裝兩種方式,dmg就多說了,下載MacPorts-1.9.2-10.6-SnowLeopard.dmg,下一步下一步安裝即可。

          通過Source安裝MacPorts

          wget http://distfiles.macports.org/MacPorts/MacPorts-1.9.2.tar.gz
          tar zxvf MacPorts-1.9.2.tar.gz
          cd MacPorts-1.9.2
          ./configure && make && sudo make install
          cd ../
          rm -rf MacPorts-1.9.2*

          然后將/opt/local/bin和/opt/local/sbin添加到$PATH搜索路徑中
          編輯/etc/profile文件中,加上
          export PATH=/opt/local/bin:$PATH
          export PATH=/opt/local/sbin:$PATH

          MacPorts使用
          更新ports tree和MacPorts版本,強烈推薦第一次運行的時候使用-v參數,顯示詳細的更新過程。
          sudo port -v selfupdate

          搜索索引中的軟件
          port search name

          安裝新軟件
          sudo port install name

          卸載軟件
          sudo port uninstall name

          查看有更新的軟件以及版本
          port outdated

          升級可以更新的軟件
          sudo port upgrade outdated

          Eclipse的插件需要subclipse需要JavaHL,下面通過MacPorts來安裝
          sudo port install subversion-javahlbindings


          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
          posted @ 2015-03-05 23:00 Eric_jiang 閱讀(1351) | 評論 (0)編輯 收藏

               摘要: 這個命令可以以遞歸的方式下載整站,并可以將下載的頁面中的鏈接轉換為本地鏈接。wget加上參數之后,即可成為相當強大的下載工具。wget -r -p -np -k /var/lcoal/  http://xxx.com/abc/-r,  --recursive(遞歸)        ...  閱讀全文
          posted @ 2015-03-05 16:54 Eric_jiang 閱讀(4117) | 評論 (0)編輯 收藏

          僅列出標題
          共57頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
          主站蜘蛛池模板: 紫金县| 个旧市| 西畴县| 永清县| 潢川县| 南涧| 福泉市| 梁河县| 正镶白旗| 石嘴山市| 化德县| 惠水县| 库尔勒市| 大宁县| 武强县| 海林市| 遂平县| 平舆县| 平度市| 泗阳县| 丰宁| 墨玉县| 紫金县| 阿拉善左旗| 宝丰县| 襄城县| 武穴市| 读书| 斗六市| 长宁县| 平遥县| 揭阳市| 辽中县| 宁津县| 晋江市| 河池市| 宁河县| 七台河市| 饶平县| 乃东县| 福海县|