所以我使用了Jetty http Web服务器作为Web服务器的核心,并且有一个指定过滤器并将它们映射到传入URL请求以执行诸如身份验证,日志记录和限制对各种文件夹的资源访问等操作的过程。
从jetty API运行HttpServer实例的代码如下所示:
org.mortbay.jetty.servlet.ServletHttpContext context = (ServletHttpContext)server.getContext(null,cono.getVirtualPath());
// System.out.println(System.getProperty("line.separator") + "#####JETTY CONTEXT name: " + context.getName() + " :cont path from getContext(): " + context.getContextPath() + System.getProperty("line.separator"));
String home = System.getProperty("server.home",cono.getHomePath());
String subdirz = cono.getSubDir();
String resourcepath = new File(home + File.separator + subdirz).getPath();
System.out.println("Using Resource Path + subdir: " + resourcepath);
boolean donote = false;
if(Utilities.matchString(resourcepath,DPSConfig.getHttpServHome()) && cono.getId() > 0) {
System.out.println(System.getProperty("line.separator") + "***Notice!*****************" + System.getProperty("line.separator") + " The resource path for this context is a subpath of the System Context Resource Path, some attributes may be overridden (as noted next to the affected item) as a result. " + System.getProperty("line.separator") + "***Notice!*****************" + System.getProperty("line.separator"));
donote = true;
}
System.out.println("On Virtual context: " + cono.getVirtualPath());
//make the resourcepath if it doesn't yet exist.
Utilities.fileMakeDirs(resourcepath);
//Set the resource base.
context.setResourceBase(resourcepath);
//Instantiate a new webapplicationhandler
WebApplicationHandler whandler = new WebApplicationHandler();
后续代码使用处理程序加载上下文,然后启动服务器。当我查看映射到其中一个活动上下文的资源时,会出现问题。
资源文件路径为:
Z:\ somefilecache
虚拟URL子目录是:
/糖果/
:假设hat somefilecache有一个名为“images”的子目录,我希望过滤器适用于对该子目录的所有请求,以仅允许经过身份验证的请求。 WebContextFilter类通过将上下文子路径映射到上一个虚拟URL来完成此操作。
所以网址:
http://www.myserver.com/goodies/images/deep/myfile.jpg
:如果请求来自经过身份验证的用户,则应返回“myfile.jpg”,否则应返回403错误。
对于上下文,配置的子路径是“/ images / *”,它应该为任何url触发WebContextFilter但是发生的事情很奇怪。当URL为:
时,不会阻止资源http://www.myserver.com/goodies//////////images/deep/myfile.jpg
但是当URL为:
时,ARE被阻止http://www.myserver.com/goodies/images/deep/myfile.jpg
:这显然不是我想要的。 “/”的数量应该无关紧要,但是出于一些奇怪的原因,留下一个简单的方法来绕过上下文的安全性。
我尝试将上下文子目录更改为各种变体:“// images / ”,“images / ”,“/ *”
对于所有这些,WebContextFilter仅针对确切的子字符串字符串而不是针对“/”的变体进行调用,然后允许未经授权的文件访问!!
是否有设置允许我覆盖上下文子目录的所有变体?基本上通过反转WebContextFilter调用。我注意到,当请求URL中的子路径不完全正确时,甚至不会调用WebContextFilter“doFilter()”...所以问题发生在WebContextFilter应用之前...服务器上下文似乎正在检查子目录路径字符串的URL,如果它存在,那么它调用WebContextFilter ...这很好但我需要能够告诉它将所有URL请求传递给WebContextFilter。
我还尝试在子目录中使用正则表达式,认为它们是有效的,但符号在字面上被解释为URL路径字符串的一部分。
非常感谢能提供的任何帮助。我使用Jetty版本5.x.x