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 阅读(1966) | 评论 (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 阅读(216) | 评论 (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 阅读(315) | 评论 (0)编辑 收藏

@import url(http://www.blogjava.net/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 阅读(603) | 评论 (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 阅读(345) | 评论 (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 阅读(1079) | 评论 (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 阅读(2006) | 评论 (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 阅读(156) | 评论 (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.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @ 2015-03-05 23:00 Eric_jiang 阅读(1331) | 评论 (0)编辑 收藏

     摘要: 这个命令可以以递归的方式下载整站,并可以将下载的页面中的链接转换为本地链接。wget加上参数之后,即可成为相当强大的下载工具。wget -r -p -np -k /var/lcoal/  http://xxx.com/abc/-r,  --recursive(递归)        ...  阅读全文
posted @ 2015-03-05 16:54 Eric_jiang 阅读(4058) | 评论 (0)编辑 收藏

仅列出标题
共57页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last