在工作中,我们继承了这个处理所有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正在它之后执行,意思是某种方式来自浏览器的请求没有通过它。
答案 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默认过滤器应该如何工作,所以请随时反驳我。