如何在Tomcat上进行服务器范围的过滤?

时间:2016-05-13 13:08:01

标签: java tomcat servlet-filters

在工作中,我们继承了这个处理所有SSO登录操作的Java类。有一个FiltroSegurancaGlobal.class映射到*,用注释强制所有内容

validationTimeout

该类部署在一个JAR中,其中包含一些其他类来处理整个SSO操作。

最近我被要求安装和配置git服务器用于内部目的,我发现了一个非常有趣的解决方案GitBlit,它就像一个魅力。

就是这样,当我将它部署到服务器时,某些请求正在通过过滤器滑动。这似乎是不可能的,所以我把过滤器改为什么:

@WebFilter(urlPatterns = { "/*" })

虽然没有加载整个应用程序,但是用户没有被重定向到登录页面,没有加载任何资源(css,js),但是(索引)仍然显示在开发人员工具窗口中与一些页面。

这怎么可能?是不是部署过滤器“/ *”urlPatterns应该过滤所有请求?

如下所述我首先尝试使用注释更改urlPatters,然后更改服务器的web.xml:

public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("filter hit");
}

然后

@WebFilter({"/", "*", "/*"})

没有任何改变。

通过探测chrome,我意识到似乎通过服务器的唯一文件是angular.js,通过搜索他们的github,我发现了一个NgController.java文件,它有一个奇怪的代码段:

<filter-mapping>
  <filter-name>FiltroSegurancaGlobal</filter-name>
  <url-pattern>/*</url-pattern>
  <url-pattern>*</url-pattern>
  <url-pattern>/</url-pattern>
</filter-mapping>

实际的类还实现了来自Apache Wicket包的IHeaderContributor,不确定这是否有助于解决问题。

我还发现这个question提到FORWARD请求,我会尝试检查这个,但我仍然不确定发生了什么。

只是一个小小的补充,似乎正确的解决方案将使用Tomcat's Valve,但该问题有一个评论提到:[过滤器]只有在webapp的/WEB-INF/web.xml有另一个时才能覆盖一个具有相同过滤器名称的。

在这种情况下,这是不可能的情况,因为我怀疑部署的应用程序是否具有相同过滤器名称的过滤器映射。

我可能会将整个事情迁移到Valve Component以确保它是服务器范围的,但我仍然不明白在这个特定场景中发生了什么。

另外:我忘了提到GitBlit在用户尝试连接时有一个控制台输出,例如:public void renderHead(IHeaderResponse response) { // add Google AngularJS reference response.renderJavascriptReference(new ResourceReference(NgController.class, "angular.js")); 我刚注意到过滤器命中system.out.println正在它之后执行,意思是某种方式来自浏览器的请求没有通过它。

2 个答案:

答案 0 :(得分:1)

仔细检查this question后,我决定将servlet迁移到阀门。

非常直接。

我只是提到我必须添加这两行代码

    HttpServletRequest servletReq = valveReq.getRequest(); 
    HttpServletResponse servletRes = valveRes.getResponse();

要使Valve按预期工作,因为原始过滤器具有基于请求的一些规则,并且如果未经过身份验证,它将重定向用户。

答案 1 :(得分:0)

我遇到了同样的问题,尽管我没有找到任何答案,但我自己进行了一些测试,得出的结论是,Tomcat的web.xml上的/ * url映射表示根上下文之下的任何内容。

假设这是您在Tomcat上部署的内容:

/ (root application)
/myApp1
/myApp2

如果您随后对URL /myApp1/users进行GET请求,则不会触发过滤器,因为您正在/myApp1上下文中执行操作。

如果您改为对URL /myApp3/users进行GET请求,则过滤器将运行,因为现在上下文为/

不幸的是,我是否已经说过,除了一些个人测试之外,我没有这个说法的来源,而且我不太了解Tomcat默认过滤器应该如何工作,所以请随时反驳我。