我看过许多示例,尽管它们似乎都有它们的“精确”副本,所以我无法弄清楚为什么导航到/login
而不是/restricted/*
时执行过滤器的原因。
我已经尝试使用批注(如下例所示)和XML来定义WebFilter。
Web过滤器
@WebFilter(filterName = "AuthenticationFilter", servletNames = { "Faces Servlet" }, urlPatterns = { "/restricted/*" } )
public class AuthenticationFilter implements Filter {
@Inject
private SessionManager sessionManager;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Active AuthenticationFilter");
if (sessionManager.getUser() == null) {
((HttpServletResponse) response).sendRedirect("/login");
}
else {
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<filter>
<filter-name>Pretty Filter</filter-name>
<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
<async-supported>true</async-supported>
</filter>
<filter-mapping>
<filter-name>Pretty Filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>ERROR</dispatcher>
<dispatcher>ASYNC</dispatcher>
</filter-mapping>
<filter>
<filter-name>NoCacheFilter</filter-name>
<filter-class>filter.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>AuthenticationFilter</filter-name>
<filter-class>filter.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>
注意
即使在两个文件中都定义了过滤器,我也可以确保不会同时使用两个符号。为了测试和审查,我确实将它们都发布了。
我是webfilter的新手,在使用多个过滤器方面找不到很多东西。但是我读过的内容可以使用多个,它们将按照您在
web.xml
中定义的顺序执行。题
有谁知道为什么我的过滤器也会在
/login
页面上执行的线索?该应用程序在Glassfish 3.1.2上运行。
最佳答案
<filter-mapping>
匹配条件不包括在内,它们是排他的。
使用以下映射
<filter-mapping>
<filter-name>AuthenticationFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/restricted/*</url-pattern>
</filter-mapping>
您基本上是在指示,每当要调用
FacesServlet
或每当URL模式与/restricted/*
匹配时,都应调用过滤器。这不是您似乎期望的“和”条件。只需删除
<servlet-name>
条目。正确的
@WebFilter
声明将是@WebFilter("/restricted/*")
假设您不需要
<filter-mapping>
(例如,如果顺序无关紧要)。