服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 核心技术 > 查看文档

在weblogic环境下调试turbine servlet实例

  turbine是jetspeed1.x使用的servlet引擎,本文的目的不在于告诉读者如何调试本文中讲述的bug,而是让大家通过本例的bug的追踪调试过程,来了解一下turbine的工作机理。

  turbine是jetspeed1.x使用的servlet引擎,本文的目的不在于告诉读者如何调试本文中讲述的bug,而是让大家通过本例的bug的追踪调试过程,来了解一下turbine的工作机理。

  一、异常描述

  我们公司的门户平台产品是基于jetspeed1.4的,使用turbine2.2作为servlet引擎,将产品部署到weblogic上,启动后打开首页,出现下面的错误:

'weblogic.kernel.default'>   <[servletcontext(id=6718343,name=portal,context-path=/portal)] getrealpath() called with unsafe path: ".".
weblogic.utils.io.filenameencoder$unsafefilenameexception: d:\bea\user_projects\domains\webapps\portal\. ends with illegal character
at weblogic.utils.io.filenameencoder.getsafefile(filenameencoder.java:210)
at weblogic.servlet.internal.webappservletcontext.getrealpath(webappservletcontext.java:916)
at org.apache.turbine.services.servlet.turbineservletservice.getrealpath(turbineservletservice.java:218)
at org.apache.turbine.services.servlet.turbineservlet.getrealpath(turbineservlet.java:134)

  二、解决方法

  打开web-inf\conf\turbineresources.properties找到下面一句:

  services.uploadservice.repository=.

  将此句等号右边的.改为/或/后加一个目录名,weblogic控制台不再报异常。

  三、异常分析

  从weblogic控制台输出的信息来看,.是一个不安全的路径,这个异常的产生过程是这样的:

  1、 turbine servlet启动。

  2、 在org.apache.turbine的doget方法中有data.setscreen(data.getparameters().getstring("screen"))的代码。

  3、 rundata的实例是defaultjetspeedrundata,此类继承了org.apache.turbine.services.defaultturbinerundata,所以在turbine类的doget方法中的data.getparameters实际是调用了defaultturbinerundata方法,此方法返回parameterparser类型,parameterparser是一个接口,实际的类是org.apache.turbine.util.parser.defaultparameterparser。在getparameters方法中有一行代码this.parameters.setrequest(this.req),异常是调用setrequest方法产生的。

  4、 再看defaultparameterparser的setrequest方法,经调试,异常是从此方法中的语句turbineupload.getautomatic()产生的,然后再看turbineupload(org.apache.turbine.services.upload.turbineupload),此类是一个抽象类,在getautomatic方法中调用了upload = getservice();

  5、 再看一下turbineupload的getservice()方法:

public static uploadservice getservice()
{
return (uploadservice)turbineservices.getinstance().
getservice(uploadservice.service_name); //service_name=uploadservice
}

  turbineservices.getinstance().getservice(uploadservice.service_name)返回的类实例是org.apache.turbine.services.upload.turbineuploadservice,而turbineservices类的getservice方法实际是调用了其父类的方法,在其父类的getservice方法中有service.init()的语句,实际上是调用了turbineuploadservice父类baseuploadservice的init()方法,看一下此方法内部的代码:

string path = getproperties()
.getproperty(uploadservice.repository_key,
uploadservice.repository_default.tostring()); //repository_key=repository
//repository_default = "."
if(!path.startswith("/"))
{
string realpath = turbineservlet.getrealpath(path);
if(realpath != null)
{
path = realpath;
}
}
getproperties().setproperty(uploadservice.repository_key, path);
setinit(true);

  从以上代码分析,path的值是从turbineresources.properties文件中读取的,从此文件中找到下面一行:

  services.uploadservice.repository=.

  path读取的等号右面的值,从上面代码中看出,如果路径不是以”/”开头,就调用turbineservlet.getrealpath(path)得到实际的路径,而此方法实际是调用了turbineservletservice的getrealpath,看turbineservletservice中的getrealpath,有这样一行代码:

  path = getservletcontext().getrealpath( uri );

  uri的值是从turbineservlet.getrealpath传递进来的,也就是从turbineresources.properties读取services.uploadservice.repository的值,目前是.getservletcontext().getrealpath(“.”)在weblogic环境下抛出了异常,所以需要修改turbineresources.properties,将services.uploadservice.repository=.改为

  services.uploadservice.repository=/ ,等号右面也可以写绝对路径或以”/”开头的相对路径。

扫描关注微信公众号