升级Struts2之后报告HTTP Status 500 - java.lang.ClassNotFoundException: org.apache.jsp.index_jsp以及org.apache.jasper.JasperException: Unable to compile class for JSP

升级 Struts22.3.20.1版本升级到 2.5.5版本后可能报告如下错误:

也有可能发生如下错误信息:

具体信息如下图:

1422265899_66497

比较诡异的是,在 Tomcat 8的环境下,是可以正常运行的,但是在 Tomcat 7环境下却会报错。造成这个现象的原因就是在引入的 Jar包中包含了 jsp-api.jar这个 Jar包,只要在最后生成的 war包中排除这个文件即可。

在阿里云的Ubuntu 14.04系统上解决Tomcat 7由于OOM(Out Of Memory)而被系统杀掉的问题

最近服务器上面一直出现 Tomcat莫名奇妙的被系统杀掉,后来从系统的日志中找到如下信息:

原来是系统内存不足,导致进程被杀掉了,网上搜了一下,解决方法有两个

1.限制 Tomcat使用的内存

方法如下:

在文件尾部增加如下配置:

然后重启 Tomcat

2.为阿里云服务器增加 swap分区,来解决物理内存不足的问题

阿里云的服务器默认没有开启交换分区,导致内存极易耗尽导致服务被杀死,解决方法就是手工增加一个交换文件,来解决这个问题。

参考链接


Tomcat 7使用AJP协议导致AJP端口被意外暴露给外网

使用Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7中的方法配置了通过 AJP协议来通过 Apache进行访问的代理。

但是最近发现 Tomcat有时候会崩溃掉。刚刚开始以为是正常的 OOM,后来分析日志,并没有找到相关的记录,反倒是发现如下内容:

于是感觉有些奇怪,因为 AJP协议应该不会发生非常频繁的通信协议错误问题。结果尝试从外网连接 TomcatAjp端口 8009,发现竟然可以通过 telnet连接成功!!说明端口意外暴露给了外网。

那么根据The AJP Connector中的介绍说明(注意 address部分),如果没有指定 IP地址的话,默认是绑定任意地址,这样就导致外网也可以访问这个端口。因此出于安全考虑,我们需要增加这个 address的设置,并且绑定到 127.0.0.1。最终结果如下:

而我在配置的时候,恰恰少设置了 address="127.0.0.1".这个这种错误有些低级啊。

IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE,sockjs-1.1.1,stomp-1.2搭建基于Tomcat-7.0.68的WebSocket应用

接着上文IntelliJ IDEA 2016.2使用Spring 4.3.1.RELEASE搭建基于Tomcat-7.0.68的WebSocket应用

上文的最后我们说到, WebSocket是需要定时心跳的,否则会在一段时间后自动断开连接,而更重要的是,不是所有的浏览器都支持 WebSocket,早期的 IE 10之前的版本就是不支持的,而这一部分的设备其实是不算少的,而 sockjs的出现,恰恰好来解决了这个问题。对于不支持 WebSocket的浏览器, sockjs使用了多种方式来兼容这种情况,包括使用长轮询等方式, Spring更是内建支持这种方式。

下面我们看如何在上篇文章的基础上,增加对于 sockjs的支持。

首先是 STOMP的文档官网地址 http://stomp.github.io/
代码的地址为https://github.com/jmesnil/stomp-websocket,项目下面的 lib/stomp.js就是我们想要的文件。也可以本站下载stomp.js.zip

接下来 sockjs的代码地址https://github.com/sockjs/sockjs-client,项目下面的 dist/sockjs-1.1.1.js就是我们想要的文件。也可以本站下载sockjs-1.1.1.js.zip

接下来我们把下载到的文件放到我们工程目录下面的 web-> resources-> javascript目录下面,如下图:

stomp-websockjs-resources

接下来,添加我们需要的 com.fasterxml.jackson.core:jackson-annotations:2.8.1, com.fasterxml.jackson.core:jackson-core:2.8.1, com.fasterxml.jackson.core:jackson-databind:2.8.1这三个 jar包,增加的方式参照上一篇中对于 javax.servlet:javax.servlet-api:3.1.0的操作方法。与上一篇的操作不同的是,这次添加的三个 jar包,都要放到编译完成后的 War包中。最后的结果如下图:
ToolsJacksonMaven

ToolsJacksonMavenWar

下面,我们开始进行代码的操作,我们在上篇文章中的 src-> Tools-> WebSocket中新增两个源代码文件 SockJsController.java, WebJsSocketConfig.java.如下图:

NewJavaSourcesForSockjs

其中的代码如下:
SockJsController.java

WebJsSocketConfig.java

然后修改 WebSocket.jsp

最后,我们修改 web-> WEB-INF-> web.xml,在其中增加

修改后的最终结果如下:

参考链接


 

Ubuntu 16.04下Tomcat 7.0.68启动服务时候报告“java.lang.NoSuchMethodError: java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;”

在使用Ubuntu16.04 安装openjdk-7-jdk介绍的方式切换 Java1.7版本后,在进行代码调试的时候, Tomcat 7.0.68报告如下错误:

这说明 Ubuntu 16.04下的 Tomcat是在 Java 8环境下面编译的,尽管我们已经切换到 Java 7下面了,但是 Tomcat并不能很好的执行我们的 Java 7代码。这个时候的解决方法就是,编译代码的时候指定 Java 7,但是在 Tomcat执行的时候,指定使用 Java 8来运行。

参考链接


Java error java.util.concurrent.ConcurrentHashMap.keySet

Ubuntu 14.04隐藏Tomcat-7.0.52的版本号与操作系统类型

一般情况下,软件的漏洞信息和特定版本,特定操作系统是相关的,因此,软件的版本号以及操作系统类型对攻击者来说是很有价值的。

在默认情况下, Tomcat会在返回信息中把自身的版本号,操作系统类型都显示出来,如下图:
TomcatErrorPageVersion

这样做会造成潜在的安全风险,导致不必要的攻击行为。

Ubuntu 14.04系统上隐藏 Tomcat-7.0.52的版本号与操作系统类型的方法如下:

可以看到里面的内容如下:

修改里面的内容,如下:

修改完成后,把修改完成的数据存储到 catalina.jar中。

把修改后的 catalina.jar放回到 Tomcat的目录下面:

重启 Tomcat的服务

修改后的结果如下图所示,已经没有系统类型信息了,仅仅返回了一个 404错误。

TomcatErrorPageVersionAfterHide

至于如何隐藏 Apache的版本号,参考链接 Ubuntu 14.04隐藏Apache-2.4的版本号与操作系统类型

在Ubuntu 14.04 系统中的Apache Tomcat上部署Apache Archiva 2.2.1

简介


Apache Archiva是一套可扩展的 Artifact Repository管理系统。它能够与 MavenContinuumANT等构建工具完美结合。 Archiva提供的功能包括:远程 Repository代理,基于角色的安全访问管理, Artifact分发、维护、查询,生成使用报告,提供基于 Web的管理界面等。 本来是 Sonatype Nexus更加方便的,但是可惜最新的版本不支持在 Tomcat中使用了,因此只能转而使用 Apache Archiva

操作步骤


1.下载 Apache Archiva

Apache官方网站下载,下载其中的 War包。如下图: DownloadArchivaHtml 也可以在本站下载. 具体的命令如下:

2.下载 Apache Archiva依赖的Jar包

Apache Archiva需要依赖 derby-10.10.1.1.jar(或更高版本)( org.apache.derby:derby:10.10.1.1), activation-1.1.jar( javax.activation:activation:1.1), mail-1.4.jar( javax.mail:mail:1.4.7).可以在Mvn Repository官网下载。也可以在本站打包下载。 下载完成后,需要放到 Tomcat的安装目录下面的 lib目录下。 具体的命令如下:

3.配置 Apache Archiva

(1)停止 Tomcat,后续的操作是先关闭 Tomcat为前提的。

(2)把下载到的 apache-archiva-2.2.1.war重命名成 archiva.war然后放到 Tomcat安装目录下的 webapps目录下面。

(3)在 Tomcat的配置文件中增加两项 appserver.homeappserver.base,两者都指向相同的目录即可,本例中,都指向了 /data/Archiva这个目录。

在脚本的第一行执行代码中增加如下内容:

注意:不要直接修改 catalina.sh这个文件,原因在于这个文件每次更新都可能会被替换掉,环境变量的设置都应该在 setenv.sh中设置。
注意 catalina.sh这个文件中的如下注释

(4)由于 Apache Archiva 2.2.1BUG,他没有自动创建必须的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建这些目录。

(5)在 Tomcat的配置目录下的 Catalina\localhost目录下面创建一个名为 archiva.xml的配置文件.

里面的内容如下:

注意其中的 Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件, url为数据库的具体存储目录,仅仅包含数据库数据。 注意: Ubuntu系统下面 CATALINA_HOME指向 /usr/share/tomcat7,而 CATALINA_BASE指向 /var/lib/tomcat7

(6)启动或者重启 Tomcat,等待几分钟之后,即可成功配置完成。

如下图: ApacheArchivaIndexPage 注意,如果在最后一步发生失败,那么我们需要删除 /data/Archiva这个目录,以及 Tomcat安装目录下面的 webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。

注意,上图中的" Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用" admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是" admin",否则会一直提示用户名或密码不正确。

注意,如果使用 Apache Httpd( Apache 2.x)作为前端代理 Tomcat的情况下部署 Apache Archiva,并且使用 AJPApache JServ Protocol)的方式进行通信,那么在配置 Apache Httpd( Apache 2.x)的配置文件的时候,里面写入的名字必须严格跟Tomcat中部署的名字一致,比如,如果Tomcat配置的时候是 archiva,那么在 Apache Httpd( Apache 2.x)的配置文件中,也必须使用 archiva,不能像其他简单项目一样进行命名重定向。如下:

里面增加的 AJP代理信息如下:

更详细的配置说明,参考 Ubuntu 13.10 Apache 2.2 通过 AJP 整合 Tomcat 7

客户端配置


在客户机上找到 .m2所在的目录,找到 settings.xml这个配置文件,如果不存在,则手工创建,里面的默认内容如下:

在其中的 mirrors中间增加如下内容:

修改后的内容变成如下样子:

目前使用的时候,发现,在 Apache Archiva刚刚配置完成后,是没办法进行访问的,这个时候一切都返回 404,等服务器启动几个小时之后,从中央服务器同步完成数据了,就可以进行访问了,这个问题纠结了好久,最后发现只要等待就可以了,不知道是不是一个通病。
另外就是,在 Apache Archiva的搜索页面中使用 Search,如果是第一次使用,会发现搜索任何包都提示找不到,原因是因为在设计的时候,只搜索本地已经下载过的包,而在中央仓库中的包是不搜索的,因此会一直提示找不到任何包,只要有任何的客户端调用过,那么就可以在搜索页中找到了,这个问题不必纠结。

引用链接


在Windows 7系统中的Apache Tomcat 7.0.68上部署Apache Archiva 2.2.1

简介


Apache Archiva是一套可扩展的 Artifact Repository管理系统。它能够与 MavenContinuumANT等构建工具完美结合。 Archiva提供的功能包括:远程 Repository代理,基于角色的安全访问管理, Artifact分发、维护、查询,生成使用报告,提供基于 Web的管理界面等。

本来是 Sonatype Nexus更加方便的,但是可惜最新的版本不支持在 Tomcat中使用了,因此只能转而使用 Apache Archiva

操作步骤


1.下载 Apache Archiva

Apache官方网站下载,下载其中的 War包。如下图:

DownloadArchivaHtml

也可以在本站下载.

2.下载 Apache Archiva依赖的Jar包

Apache Archiva需要依赖 derby-10.10.1.1.jar(或更高版本)( org.apache.derby:derby:10.10.1.1), activation-1.1.jar( javax.activation:activation:1.1), mail-1.4.jar( javax.mail:mail:1.4.7).可以在Mvn Repository官网下载。也可以在本站打包下载

下载完成后,需要放到 Tomcat的安装目录下面的 lib目录下。

3.配置 Apache Archiva

(1)停止 Tomcat,后续的操作是先关闭 Tomcat为前提的。
(2)把下载到的 apache-archiva-2.2.1.war重命名成 archiva.war然后放到 Tomcat安装目录下的 webapps目录下面。
(3)在开始菜单中找到 Tomcat的配置项 Configure Tomcat,然后增加两项 appserver.homeappserver.base,两者都指向相同的目录即可,本例中,都指向了 D:\Archiva这个目录。具体如下图:
ApacheTomcat7Properties
(4)由于 Apache Archiva 2.2.1BUG,他没有自动创建一个名为 conf的目录,导致如果这个目录不存在会初始化失败。因此我们需要手动创建 D:\Archiva\conf这个目录。
(5)在 Tomcat的安装目录下的 conf\Catalina\localhost目录下面创建一个名为 archiva.xml的配置文件,里面的内容如下:

注意其中的 Context path为数据库相关配置文件所在的路径,包含配置,数据库等等很多文件, url为数据库的具体存储目录,仅仅包含数据库数据。
(6)启动或者重启 Tomcat,等待几分钟之后,即可成功配置完成。如下图:
ApacheArchivaIndexPage
注意,如果在最后一步发生失败,那么我们需要删除 D:\Archiva这个目录,以及 Tomcat安装目录下面的 webapps\archiva这两个目录,原因是在配置过程中修改了部分文件,如果不删除这几个文件,会导致各种异常。

注意上图中的" Create Admin User"按钮,当创建用户的时候,貌似用户名是可以不用" admin"的,但是,实际上,管理员的用户名是不变的,不管你输入什么,最后登陆的时候填写的用户名,永远必须是" admin",否则会一直提示用户名或密码不正确。

引用链接


Ubuntu 12.04 系统下设置Tomcat 7服务器上JVM的内存大小

以前都是正常的Tomcat 7服务器,在增加了一个新工程后,无法正常访问,查看日志:

可以看到如下错误信息:

说明Tomcat在增加新工程后,内存不足了。

解决方法如下:

修改 /etc/default/tomcat7文件:

找到如下信息:

可以看到,目前限制的内存最大值为128MB, -Xmx128m,调整到256MB后重启Tomcat7。

解决问题。

修改Tomcat Connector运行模式,优化Tomcat运行性能

Tomcat是一个小型的轻量级应用服务器,也是JavaEE开发人员最常用的服务器之一。不过,许多开发人员不知道的是,Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式,那么这三种运行模式有什么区别呢,我们又如何修改Tomcat Connector的运行模式来提高Tomcat的运行性能呢?
下面,我们先大致了解Tomcat Connector的三种运行模式。

bio


bio(blocking I/O),顾名思义,即阻塞式I/O操作,表示Tomcat使用的是传统的Java I/O操作(即 java.io包及其子包)。Tomcat在默认情况下,就是以bio模式运行的。遗憾的是,就一般而言,bio模式是三种运行模式中性能最低的一种。我们可以通过Tomcat Manager来查看服务器的当前状态。【点击这里可以查看Tomcat Manager用户配置的相关信息】

tomcat-status-bio

nio


nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即 java.nio包及其子包)。Java nio是一个基于缓冲区、并能提供非阻塞I/O操作的Java API,因此nio也被看成是 non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。要让Tomcat以nio模式来运行也比较简单,我们只需要在 Tomcat安装目录/conf/server.xml文件中将如下配置:

中的protocol属性值改为 org.apache.coyote.http11.Http11NioProtocol即可:

此时,我们就可以在Tomcat Manager中看到当前服务器状态页面的HTTP协议的Connector运行模式已经从 http-bio-8080变成了 http-nio-8080tomcat-status-nio

apr


apr(Apache Portable Runtime/Apache可移植运行时),是Apache HTTP服务器的支持库。你可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作,从而大大地提高Tomcat对静态文件的处理性能。 Tomcat apr也是在Tomcat上运行高并发应用的首选模式。如果我们的Tomcat不是在apr模式下运行,在启动Tomcat的时候,我们可以在日志信息中看到类似如下信息:

Tomcat apr运行模式的配置是三种运行模式之中相对比较麻烦的一种。据官方文档所述,Tomcat apr需要以下三个组件的支持:

  • APR library[APR库]
  • JNI wrappers for APR used by Tomcat (libtcnative)[简单地说,如果是在Windows操作系统上,就是一个名为tcnative-1.dll的动态链接库文件]
  • OpenSSL libraries[OpenSSL库]

此外,与配置nio运行模式一样,也需要将对应的 Connector节点的 protocol属性值改为 org.apache.coyote.http11.Http11AprProtocol。 不过,上述繁琐的操作都是Tomcat 7.0.30之前的版本才需要这样配置,从Tomcat 7.0.30版本开始,Tomcat已经自带了 tcnative-1.dll等文件,并且默认就是在Tomcat apr模式下运行,因此我们只需要下载最新版本的Tomcat直接使用即可。tomcat-status-apr

此外,即使不使用Tomcat Manager,我们也可以区分出Tomcat当前的运行模式。如果以不同的Connector模式启动,在Tomcat的启动日志信息中一般会包含类似如下的不同内容,我们只需要根据这些信息即可判断出当前Tomcat的运行模式:

bio
信息: Starting ProtocolHandler ["http-bio-8080"] 2013-8-6 16:17:50 org.apache.coyote.AbstractProtocol start
nio
信息: Starting ProtocolHandler ["http-nio-8080"] 2013-8-6 16:59:53 org.apache.coyote.AbstractProtocol start
apr
信息: Starting ProtocolHandler ["http-apr-8080"] 2013-8-6 17:03:07 org.apache.coyote.AbstractProtocol start

参考链接


修改Tomcat Connector运行模式,优化Tomcat运行性能