Jetty Context Filter似乎可以向后工作

时间:2014-08-25 13:31:58

标签: java-ee servlet-filters embedded-jetty

所以我使用了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

0 个答案:

没有答案