1

我创建了一个servlet 过滤器来处理会话超时和身份验证。

@WebFilter(urlPatterns={"/acc/*"})
public class ResourceAuthorizationFilter implements Filter { ... }

我要过滤的页面有这样的模式:/acc/login-flow, /acc/profiles-flow. 过滤器也会为资源(css、js 和图像)调用。如何配置urlPatterns从过滤这些资源中排除?

EDIT1
以下是一些被过滤的网址:

http://localhost:8081/acme-0.0.1/acc/login-flow
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/theme.css
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/jquery/jquery.js
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/primefaces.js
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/ajax.gif
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/login.png
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/header.png
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/images/ui-bg_flat_75_ffffff_40x100.png
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/images/default.png
http://localhost:8081/acme-0.0.1/acc/javax.faces.resource/images/ui-icons_888888_256x240.png

我在webapp/resources文件夹下有一些自定义 css/js 文件,但这些文件不是来自那里。

acc部分来自:

<servlet-mapping>
    <servlet-name>Spring MVC Servlet</servlet-name>
    <url-pattern>/acc/*</url-pattern>
</servlet-mapping>

EDIT2
这些代码示例来自一个使用 JSF 2.0、PrimeFaces 3.4.1、Spring 3.0.5.RELEASE、Spring Security 3.0.3.RELEASE 和 Spring Web Flow 2.3.0.RELEASE 实现的项目。

4

2 回答 2

2

只需将资源移动到外部的不同文件夹/acc。默认情况下,它们无论如何都应该在文件夹中,/resources以便您可以以正确的方式使用。<h:outputScript><h:outputStylesheet><h:graphicImage>

如果由于某种原因您无法解决该问题,那么您确实需要在doFilter()实现中检查请求 URI。即没有办法在 URL 模式中排除子模式。

String path = request.getRequestURI().substring(request.getContextPath().length());

if (path.startsWith("/acc" + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
} else {
    // ...
}

更新:根据您的问题更新,您使用 Spring MVC 的原因不明。它还处理所有 JSF 资源请求。你应该告诉它不要那样做。我无法从头顶告诉如何做到这一点,但它至少与<mvc:resources>.

于 2012-10-18T13:57:16.710 回答
1

如果您已经在项目中使用 Spring Security。在安全上下文中注册您的自定义会话管理过滤器很容易,然后您可以轻松地排除添加新拦截 url 元素的模式,如下所示:

<intercept-url pattern="/javax.faces.resource/**" filters="none"/>

请参阅命名空间配置文档

如果设置为“无”,则从应用的任何过滤器中删除路径。

也可以看看:

于 2012-10-18T16:12:13.017 回答