服务器日志中出现大量异常:file:/wap/portal/status.jsp not found
Liferay版本:6.1.1
今天发现服务器portal/logs目录下面的日志中出现了大量的下面的的异常。分析解决思路如下:
1、正常的访问没有任何异常;
2、根据异常的堆栈信息可以看到里面有wap的字样,怀疑是移动设备访问时出现的,使用手机访问(Android设备),用手机版chrome、UC、QQ浏览器访问。之所以用这么多浏览器,是因为基于之前对Liferay的了解,liferay识别是否是移动设备,主要是根据头信息里面的accept里面是否包含wap.xhtml字符串来判断的,现在的手机上的浏览器,很多都不再在请求里面附加这样的内容,经测试只有QQ浏览器,默认的时候会在请求里面添加wap.xhtml。
3、在手机上访问会进入到手机的主题,由于此系统没有单独开发手机的主题,所以进入的页面中只有菜单,后台中也无异常。
4、再次观察异常,是/wap/portal/status.jsp这样的页面找不到,根据liferay正常的情况,要进入html/portal/status.jsp的情况是出出404的时候,所以在手机浏览器的地址栏里面输入一个不存在的URL,在控制台中重现异常。
5、到现在问题的原因知道了。当使用某些手机浏览器访问的时候,liferay会识别为手机的主题,访问不存在的页面时,会出现此问题,但是手机主题里面没有提供找不到页面时的处理页面,所以出现了此问题。
解决方法:
现在知道问题,要解决基本上是让liferay不再识别手机访问(也没有开发手机主题,识别也没意义),将所有的请求都转向到正常的浏览器访问的请求。
但是Liferay并没有提供一个配置项来进行配置是否禁用掉wap,所以只有自己修改Liferay源码了
关键代码为:com.liferay.portal.servlet.browserSnifferImpl.java里面的isWapXhtml()方法
注释掉里面处理内容,让他直接返回false,如下图
然后对Liferay源码进行编译,打包,然后复制portal-impl.jar覆盖服务器上的即可。
编译过程参看《Liferay 6.1开发学习(五):编译调试修改源码》
</pre> <pre>05:46:18,887 ERROR [http-apr-80-exec-550][LiferayMethodExceptionEventHandler:33] javax.servlet.ServletException:</pre> <pre> File "/wap/portal/status.jsp" not found javax.servlet.ServletException: File "/wap/portal/status.jsp" not found at org.apache.jasper.servlet.JspServlet.handleMissingResource(JspServlet.java:412) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379) at org.apache.jsp.wap.common.themes.portal_jsp._jspx_meth_liferay_002dtheme_005finclude_005f0(portal_jsp.java:421) at org.apache.jsp.wap.common.themes.portal_jsp._jspService(portal_jsp.java:396) at com.liferay.portal.struts.StrutsUtil.forward(StrutsUtil.java:79)