使用Tuckey URL重写时,仅筛选JSF页面的模式而不是静态资源

时间:2015-03-24 13:25:18

标签: jsf servlet-filters

我正在实施过滤器,将过期的用户重定向到密码页。

我还使用Tuckey URL重写来隐藏.xhtml扩展名。

我现在的问题是如何设置我的过滤器以仅过滤JSF页面而不过滤静态资源?

1 个答案:

答案 0 :(得分:2)

在 URL重写过滤器之后,在web.xml 中映射用户过滤器时,您不需要更改用户过滤器的逻辑,并且还会在{{1>上显式调度它}}。这样,传入的请求URL / URI将只是原始的。默认情况下,在FORWARD上调度过滤器,当链中的某个其他过滤器执行REQUEST调用时,这将错过命中,就像URL重写过滤器一样。

RequestDispatcher#forward()

为了使其更具体,您还可以将过滤器挂钩到特定的servlet而不是URL模式。以下示例假设您已在<!-- Should be placed *after* URL rewrite filter. --> <filter-mapping> <filter-name>yourLoginFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping> FacesServlet上映射<servlet-name>(请注意,您仍需要保留前向调度程序):

facesServlet

无论哪种方式,请注意,如果您还想允许原始URL(因此您尚未配置URL重写过滤器以将其重定向到重写的URL),那么您需要明确指定{{ 1}}调度程序以及上面显示的,否则当用户使用原始URL直接请求页面时,过滤器将不会运行。如果您不允许原始网址,只需删除<!-- Should be placed *after* URL rewrite filter. --> <filter-mapping> <filter-name>yourLoginFilter</filter-name> <servlet-name>facesServlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>

尽管如此,在这种情况下,术语“静态资源”有些含糊不清。你当然想说CSS / JS /图像资源,但上面的过滤器仍然会涵盖JSF通过REQUEST<dispatcher>REQUEST</dispatcher>等管理的那些,所有这些都具有<h:outputStylesheet>网址格式。您最好在请求网址上的过滤器中执行额外检查,如下所示:

<h:outputScript>

另见: