公司的运营管理系统是用SSH开发,经过考虑目前新开发的运营管理功能改为gwt和spring来开发,所以就必须新搭建一个开发框架,并且能与原先的框架集成在一起。经过两个星期的努力,框架基本是成型了,并且也开始了管理功能的开发,使用gwt开发,总体上可以说比以前的开发快多了,同时代码也比较好维护。
由于旧运营管理系统设计的菜单是以连接的形式,所以设想是以一个菜单为一个gwt页面,在集成系统的初期就发现,把新的功能集成到旧系统里面,gwt的rpc请求都错误,报编码错误,经过查询才发现,原来旧项目的web.xml配置了编码filter(如配置一),真狠这个过滤器做的动作就是,把所有请求和返回的编码都设置成GBK(如配置二),而现在新开发的工程使用的是utf-8编码,在不明原先设计的用意下,只能新加一个gwt filter,只要是gwt的请求都设置回utf-8。
配置一
<filter>
<filter-name>encodefilter</filter-name>
<filter-class>com.demo.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodefilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置二
<filter>
<filter-name>gwtEncodefilter</filter-name>
<filter-class>com.demo.GWTEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>gwtEncodefilter</filter-name>
<url-pattern>/gwt/rpc/*</url-pattern>
</filter-mapping>
原本应该没什么问题了,这两天一上线就出现问题,第一个问题是对使用ajax post请求的页面都乱码,第二个问题是弹出用户没有权限的问题;先看第一问题,既然测试环境和生产环境都是Linux,并且在测试环境测试是不会出现乱码的,第一判断是两个系统的编码问题,所以看了看生产的编码居然是zh_CN.GB18030,而测试环境是zh_CN.utf-8,这么这还跟系统的编码有关呢,发现web.xml,有配置一个sitemesh的过滤链(如配置三),初步怀疑是这个问题,这个得debug一下才行,经过debug发现有真的就是这个过滤器的问题,好了还是得加一个过滤器来拦截,避免再次被转码(如配置四),这次是直接替换该过滤链,来达到对gwt的请求忽略处理。
配置三
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置四
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.demo.MyPageFilter</filter-class>
<init-param>
<param-name>GWTEncoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>GWTURL</param-name>
<param-value>^/gwt/.*$|^.*/[tT]emplate.*html$</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最后一个问题,由于在测试环境都是直接用超级管理员用户去测试的,所以没有发现问题,在生产才暴露出来,看来也是测试人员的一个疏忽,查看后发现居然又有一个权限的过滤器来对服务请求做权限处理,看了代码才觉得这个过滤器的代码很有意思,直接判断是不是.do结尾的服务才判断,其它直接返回没有权限,这会就很快就按照前两次的经验很快就解决了问题。
重新升级了系统,终于成功了,这回总算是集成成功了!