我正在实施过滤器,将过期的用户重定向到密码页。
我还使用Tuckey URL重写来隐藏.xhtml扩展名。
我现在的问题是如何设置我的过滤器以仅过滤JSF页面而不过滤静态资源?
答案 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>