为Servlet过滤器提供多个URL模式


76

我在JSF应用程序中使用了Servlet过滤器。我的应用程序中有三组Web页面,我想在Servlet过滤器中检查这些页面的Authentication:

我的资料夹

/Admin/ *.xhtml

/Supervisor/*.xhtml
/Employee/*.xhtml

我写得web.xml

<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.ems.admin.servlet.LoginFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Employee/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Admin/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/Supervisor/*</url-pattern>
</filter-mapping>

但要求像

http://localhost:8080/EMS2/faces/Html/Admin/Upload.xhtml

没有进入过滤器。

我必须为这3个文件夹提供安全性。

如何解决这个问题呢 ?

Answers:


134

如果URL模式以开头/,则它是相对于上下文根的。该/Admin/*URL模式仅会匹配上的页面http://localhost:8080/EMS2/Admin/*(假设这/EMS2是上下文路径),但是实际上将它们放在上http://localhost:8080/EMS2/faces/Html/Admin/*,因此您的URL模式永远不会匹配。

您还需要为URL模式加上前缀,/faces/Html如下所示:

<url-pattern>/faces/Html/Admin/*</url-pattern>

或者,您也可以只重新配置Web项目的结构/配置,以便摆脱/faces/HtmlURL中的路径,例如,只需打开页面即可http://localhost:8080/EMS2/Admin/Upload.xhtml

您的过滤器映射语法很好。但是,指定多个URL模式的一种更简单的方法是仅使用一个<filter-mapping>具有多个<url-pattern>条目的模式:

<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/faces/Html/Employee/*</url-pattern>
    <url-pattern>/faces/Html/Admin/*</url-pattern>
    <url-pattern>/faces/Html/Supervisor/*</url-pattern>
</filter-mapping>

4
据我所知,不允许使用多个url-pattern元素,它们不能按预期方式工作。
Sebastian vom Meer 2013年

15
@SebastianG:您的具体问题是在其他地方引起的。请注意,<url-pattern>在Servlet 2.5(大约7年前发布的Java EE 5的一部分)中引入了对多个元素的支持。也许您正在研究史前的野兽,或者您遇到了严重的配置问题,这导致您的容器以与Servlet 2.4或更旧版本匹配的后备方式运行,从而失去了Servlet 2.5的所有功能。
BalusC

15
请注意,如果多个<filter-mapping>匹配相同的资源,则它们将执行两次相同的过滤器,例如,一个使用,/*而另一个使用/foo.xhtmlas url-pattern。我在JBoss AS 7.1上遇到此行为。
塞巴斯蒂安·霍夫曼

1
@Paranaix:这确实是指定的行为。也许您正在混入servlet映射,该映射实际上只会执行具有最佳匹配URL模式的servlet。
BalusC 2015年


20

如果您将注释方法用于过滤器定义(而不是在中定义过滤器web.xml),则可以通过在@WebFilter注释中放置一个映射数组来做到这一点:

/**
 * Filter implementation class LoginFilter
 */
@WebFilter(urlPatterns = { "/faces/Html/Employee","/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginFilter implements Filter {
    ...

就像FYI一样,这同样适用于使用servlet批注的servlet:

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet({"/faces/Html/Employee", "/faces/Html/Admin", "/faces/Html/Supervisor"})
public class LoginServlet extends HttpServlet {
    ...

8
即使只是示例FilterHttpServlet也可以扩展a而不是更好吗?
亚历山大

可以针对不同的servlet URL模式执行过滤器。您不能用servlet替换过滤器。
Ravindra Gullapalli '16

他想要一个过滤器行为,而不是一个servlet行为。我猜他已经将这些URL映射到servlet。
АнтонАнтонов
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.