getRealPath

news/2024/7/10 5:34:43 标签: asp.net, weblogic, sharepoint, path, build, servlet

getRealPath

  getRealPath()方法
  JSP servlet API提供了getRealPath(path)方法,返回给定虚拟路径的真实路径,如果转换错误,则返回null。
  getRealPath语法定义:
  public java.lang.String getRealPath(java.lang.String path)
  返回一个字符串,包含一个给定虚拟路径的真实路径。例如,虚拟路径 "/index.html"
  不管在服务器文件系统上具有怎样的真实路径,使用"/index.html"总可以找到它。返回的真实路径使用了相近于servlet容器(srvlet container)所在计算机或操作系统的格式,包含了适当的路径分隔符。如果servlet容器无法转换则这个方法将返回null。
  参数:
  path -一个描述了虚拟路径的字符串
  返回值:
  描述真实路径的字符串或者null
  遗憾的是,getRealPath常常返回不同的东西,这取决于服务器或jsp文件调用此方法的路径位置。
  假设我们的站点组织如下:
  根路径包含了我们的站点的根: http://address/
  a_virtual目录包含了我们站点提供的虚拟路径的文件,例如:
  http://addess/virtual_dir/
  我们查找file1.txt和file2.txt的真实路径,它们一个在站点根路径下,一个在虚拟路径下
  。 getRealPath("/file1.txt") 应该返回“C:/site/site_root/file1.txt",
  getRealPath("/virtual_dir/file2.txt")应该返回"C:/site/a_virtual/file2.txt"
  getRealPath("/file3.txt")应该返回null,因为这个文件不存在。
  但getRealPath()并不总是返回同样的结果,这还取决与你使用的js引擎。

用法如:

String uploadDir = getServletContext().getRealPath("/upload");

if(uploadDir == null){
out.print("无法访问该目录!");
return;
}
File fDir = new File(uploadDir);
if(!fDir.exists()){
if(!fDir.mkdirs()){
out.print("创建目录失败");
return;
}
}

 

(_)

在ASP.NET 2.0出现之前,ASP.NET源代码页面只不过是部署到服务器上的一个.aspx文件,并且位于一个特殊的文件夹中。磁盘上的.aspx资源与文件之间必须一一对应。在ASP.NET 2.0中,虚拟路径提供程序机制允许我们虚拟化处理大量文件,甚至可以处理一个目录结构。我们可以从文件系统的物理结构中抽象出Web内容。为了满足SharePoint的需要而建立的虚拟路径提供程序,被证明也适用于ASP.NET开发人员(SharePoint的下一个版本将建立在ASP.NET 2.0之上)。例如,我们可以注册一个路径提供程序,并向ASP.NET提供从一个数据库中读取的页面的源代码(听起来很熟悉,不是吗?是的,这正是SharePoint基于ASP.NET 2.0所实现的,而且将来还是这样)。

1. 虚拟路径提供程序的结构

虚拟路径提供程序(virtual path provider,简称VPP)是一个继承VirtualPathProvider类,并实现了Web应用程序的虚拟文件系统的类。在这样一个虚拟文件系统中,实际上使用自定义的数据存储(而不是文件系统)作为文件和目录。与处理一个ASP.NET请求相关的大多数文件都可以存储在一个虚拟文件系统中,这些文件包括ASP.NET页面、主题、母版页、用户控件、映射到一个build提供程序的自定义资源以及静态Web资源(诸如HTML页面和图像)。

VPP不能提供全局资源(诸如global.asax和web.config)和保留文件夹(诸如Bin、App_Code、App_Data、App_GlobalResources和任何一个App_LocalResources文件夹)的内容。表1.12详细描述了在一个VPP组件实例中要重写的成员。

表1.12 VirtualPathProvider类的成员

成 员

描    述

CombineVirtualPaths

将一个基本路径与一个相对路径合并,向一个虚拟资源返回完整路径

DirectoryExists

指出在虚拟文件系统中是否存在某个目录

FileExists

指出在虚拟文件系统中是否存在某个文件

GetCacheDependency

根据指定的虚拟路径创建缓存依赖性

GetCacheKey

返回一个用于指定的虚拟路径的缓存键

GetDirectory

获得一个对VirtualDirectory派生类的引用,表示映射到被请求的资源的虚拟目录

GetFile

获得对VirtualFile派生类的引用,表示映射到被请求的资源的虚拟文件

GetFileHash

返回指定虚拟路径的散列值

Previous

受保护的属性,获得对以前注册的VPP对象的引用,以确保资源既可以通过一个注册的VPP进行解析,也可以通过默认的VPP进行解析

编写自定义的VPP时,重要的是重写GetFile和GetDirectory,并谨慎地使用Previous属性。下面给出了一个实例:

public override VirtualFile GetFile(string virtualPath)

{

if (IsPathVirtual(virtualPath))

return new YourVirtualFile(virtualPath, this);

else

return Previous.GetFile(virtualPath);

}

在上述代码中,IsPathVirtual是一个private函数,它只是确定你的VPP能否处理该虚拟路径。如果不能,则沿着ASP.NET链把请求向下传递到下一个VPP。如果忽略了对Previous的调用,则该请求不会被处理。

private bool IsPathVirtual(string virtualPath)

{

// For example

// Check the virtual path against your data store

}

有关的更多信息和范例代码,请参考MSDN联机文档。

2. 虚拟文件的结构

虚拟路径提供程序通过接受URL,并检查是否已注册了一个处理该URL的VPP来工作的。如果已经注册了,则该VPP返回那个路径的ASP.NET源代码。VPP通过一个继承自VirtualFile类的对象返回虚拟路径的源代码。

表1.13 VirtualFile类的成员

成员

描    述

IsDirectory

指示这是否是一个应当作为文件看待的虚拟资源

Name

获得虚拟文件的显示名称

VirtualPath

获得虚拟文件的路径

Open

返回一个引用被请求资源的内容的只读流

编写自定义的虚拟文件类时的关键问题是重写Open方法,并使它为虚拟资源的内容返回一个只读流。在Open方法中,使用虚拟路径作为键来访问数据存储和检索源代码。有关的更多信息和范例代码,请参考MSDN联机文档。

3. 注册一个虚拟路径提供程序

与大多数提供程序不同的是,虚拟路径提供程序不是通过web.config文件注册的。我们既可以在Application_Start全局事件中注册VPP,也可以通过把静态的AppInitialize方法添加到App_Code文件夹中部署的某个类来注册。下面给出了一个可以放入App_Code文件中用来注册一个VPP的示例类:

public static class AppStart

{

public static void AppInitialize()

{

// Add a new VPP to the chain

MyPathProvider vpp = new MyPathProvider();

HostingEnvironment.RegisterVirtualPathProvider(vpp);

}

}

环境类的名称是任意的;AppInitialize的名称和签名则不是。如果在App_Code文件夹中存储的不同类中存在多个具有此名称的静态方法,则会得到一个编译错误。

*重要提示   在任何页面解析或编译之前注册虚拟路径提供程序非常重要。如果在应用程序或页面生存期的其他地方注册路径提供程序(例如,在web.config中),则可能会出现一些意想不到的结果。例如,在Page_Load中,没有任何语法方面的要求会阻止我们注册一个VPP。但是,如果在页面程序集生成之后注册该VPP,则无法使该页面与程序集之间的联系无效。由此造成的后果是,在请求页面时将忽略VPP。在一个页面事件内注册一个VPP仍然是合理的,但只能从一个不是由VPP服务的并且在VPP服务的任何页面之前被调用的页面中注册VPP。可以看出,这种情况并不正常。

小    结

自1.0版以来,ASP.NET就一直即时动态地编译几种文件类型,特别是.aspx Web页面。页面文件在应用程序第一次需要它们时自动地按要求编译。对动态编译的文件的源代码所作的任何更改,都会自动地使对应的程序集无效,然后重新建立该程序集。这种机制大大简化了应用程序开发,因为开发人员只需保存文件并刷新页面,就可以马上把变更应用于应用程序。

在ASP.NET 2.0中,虽然高层模式保持不变,但是底层机制发生了重大变化。新的build系统自动地管理相当多的文件类型,包括ASP.NET页面、母版和主题文件、资源和XSD架构。这些文件提供了对期望结果的描述,并使用一个隐藏得组件来解析内容和生成一个可编译的类。新的ASP.NET build系统不需要在Visual Studio集成开发环境(IDE)进行显式的预编译,并提供了一个可扩展的模型,该模型允许增加新的文件类型。build提供程序是该模型的核心。通过编写自定义的build提供程序,可以让ASP.NET维护和编译我们自己的资源。build提供程序是Visual Studio 2005中一流的IntelliSense功能背后的核心,同时也是ASP.NET站点,预编译幕后的主要技术。

本章要点

þ        对.aspx资源(即,ASP.NET页面)的请求,被映射到一个实现了IHttpHandler接口的托管类。如果该类不存在,则动态地创建它。

þ        动态页面编译涉及两个步骤:解析.aspx文件的内容,然后生成一个类文件并被编译成一个程序集。在ASP.NET 1.x中,该模型仅支持几个预定义的文件类型,而现在被重构和扩展,也可以支持自定义的文件类型。

þ        build提供程序是系统组件,用于解析具有给定扩展名的文件,并返回一个要编译的类文件。build提供程序在内部通常使用CodeDOM API来生成代码树。我们可以编写自定义的build提供程序,让ASP.NET根据文本描述生成自己的类。

þ        ASP.NET 2.0定义了几个保留文件夹,只用于保存某些类型的资源,诸如类文件、页面资源和WSDL文档。

þ        在ASP.NET 2.0中,可以对一个站点进行本地预编译,以消除由于编译而造成的首次命中延迟;此外,也可以对站点进行部署预编译。在后一种情况下,我们得到网站的一个镜像,其中ASPX文件被编译成程序集,并且不部署任何源代码或标记。

()

weblogic环境下getRealPath() called with unsafe问题的处理 (2007-08-30 10:25:31)
 

weblogic环境下getRealPath() called with unsafe问题的处理
环境:weblogic,portal4.5
问题:访问页面的时候没有任何错误,只是在mydomain.log里面经常会发现下面的错误信息
<2007-8-29 下午05时21分06秒 CST> <Error> <HTTP> <BEA-101005> <[ServletContext(id
=2268995,name=wzportal,context-path=/wzportal)] getRealPath() called with unsafe
 path: ".".
weblogic.utils.io.FilenameEncoder$UnsafeFilenameException: D:/bea/user_projects/
domains/mydomain/applications/wzportal/. ends with illegal character
        at weblogic.utils.io.FilenameEncoder.getSafeFile(FilenameEncoder.java:21
5)
        at weblogic.servlet.internal.WebAppServletContext.getRealPath(WebAppServ
letContext.java:1009)
解决方法:修改WEB-INF/conf/NpsuiteResources.properties文件,搜索到services.UploadService.repository,在=后面加上/
[em02]是不是感觉很简单啊,下面来点让你头晕的。

分析:引用自http://www.cn-java.com/target/news.php?news_id=3515
从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=/ ,等号右面也可以写绝对路径或以”/”开头的相对路径。
上面提到的是TurbineResources.properties文件中修改services.UploadService.repository配置,portal4.5中找了半天没这个文件,还是在别人的提醒下才知道portal4.5将TurbineResources.properties文件整合在了NpsuiteResources.properties文件中。


http://www.niftyadmin.cn/n/1050767.html

相关文章

linux 学习 查看文件占用空间大小

du -ah data --max-depth1转载于:https://www.cnblogs.com/liufei1983/p/9176394.html

Spring整合Sharding-JDBC分库分表详情

Spring整合Sharding-JDBC分库分表详情 一、概述 最初线上系统的业务量不是很大&#xff0c;业务数据量并不大&#xff0c;比如说单库的数据量在百万级别以下&#xff08;事实上千万级别以下都还能支撑&#xff09;&#xff0c;那么MySQL的单库即可完成任何增/删/改/查的业务操…

7-2 符号配对 (20 分)

题目&#xff1a; 请编写程序检查C语言源程序中下列符号是否配对&#xff1a;/*与*/、(与)、[与]、{与}。 输入格式: 输入为一个C语言源程序。当读到某一行中只有一个句点.和一个回车的时候&#xff0c;标志着输入结束。程序中需要检查配对的符号不超过100个。 输出格式: 首先&…

警告: No configuration found for the specified action: '/myNameSpace/login.action' in names

今天花了点时间把struts2警告事件彻底的测试了一边&#xff0c;终于有点眉目了。希望能给其他人带来一点帮助。文章属于原创。并不需要转载的时候注明出处&#xff0c;而是希望转载的朋友一定要看明白本文内容再转载&#xff0c;因为我你都清楚&#xff0c;现在去google或百度得…

linux学习------磁盘性能测试

测试服务器 1核1G配置 下载后放在你想测试的目录下&#xff0c;执行preparefile.sh准备测试文件&#xff0c;完成后执行runTest.sh执行测试&#xff0c;等待测试结果完成。 {sysbench_bin}> sh preparefile.shsysbench 0.5: multi-threaded system evaluation benchmark2 f…

SpringCloud技术指南系列(八)配置管理之Consul配置中心

SpringCloud技术指南系列&#xff08;八&#xff09;配置管理之Consul配置中心 Spring Boot应用的配置文件有多种&#xff1a; 我们可以将配置内容写入application.yml 设置多个profile&#xff0c;也可以用多个application-{profile}.properties文件配置 命令行参数 自定义…

pl/sql 的内置函数good

这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如: VARCHAR2数值被限制为2000字符(ORACLE 8中为4000字符),而CHAR数值被限制为25…

guake 3.4发布,支持切分窗口

guake是一款下拉式终端&#xff0c;美观实用。 近日发布了3.4版本&#xff0c;在3.4版本中支持了切分窗口功能。如图所示&#xff0c;还是比较实用的一个功能。 目前ubuntu仓库中还未更新&#xff0c;需要使用pip安装&#xff0c;或者自行从源码编译安装。 Guake 在2018年被移植…