概述
近期参与了公司的另一个项目,将业务系统的中间件由Weblogic替换为Tomcat,具体的版本为:
Weblogic10 + JDK6 ==> Tomcat7 + JDK6
针对过程中遇到的问题与解决做总结记录。
总结
主要差异点
- 中间件差别:Weblogic10与Tomcat7,Weblogic为Oracle公司的商用中间件支持Servlet规范EJB规范等,Tomcat只支持servlet规范,但是开源免费,但两者在一些实现上还是有些差别
- weblogic的JVM为jrockit,目前我们配套tomcat使用的JVM为Hotspot
- 目前公司所用Tomcat支持分布式会话存储,Redis Session
永久代问题
- 方法区主要用来存储运行时常量池、静态变量、类信息、JIT编译后的代码等数据。
- 永久代(Permanent Generation)是 HotSpot 虚拟机在 JDK7 及以前对方法区的具体实现
- 当永久代内存溢出时:java.lang.OutOfMemoryError: PermGen space
- 永久代配置:-XX:PermSize=512m -XX:MaxPermSize=512m(默认为64m)
Redis Session
存储在session的对象需要支持Java序列化,否则不会存入session任何信息,但不会报错,只是无法获取期望的内容
public class GlobalInput implements Serializable {
...
}
url中文字符乱码问题
url中的参数如果包含中文,则可能出现乱码问题
首先在js中设置url编码
showInfo = window.open(encodeURI( "../sys/LDPersonIdQueryMain.jsp?queryFlag=queryAppnt&appntIDNo="+""+"&appntName="+appntName+"&appntSex="+appntSex+"&appntBirthday='"+appntBirthday+"'" ));
Tomcat设置:/conf/server.xml,标签增加属性URIEncoding=“UTF-8”:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
cookie管理问题
服务端建立的Cookie如果没有设置HttpOnly属性,则在客户端可以用js读取Cookie中的内容(客户端脚本可以读取Session Cookie内容进行诸如CSRF/XSS恶意http攻击)
Tomcat7中默认为HttpOnly=true,即js文件不能够读取Cookie内容
系统中Applet控件(主要是一些打印功能)需要需要获取cookie中的sessionId出现问题
Tomcat配置:/conf/server.xml中,标签中新增以下标签:
<Context path="" docBase="/app/lis" useHttpOnly="false" ></Context>