与omnifaces无扩展名URL一起使用时,过滤器无法正常运行

时间:2014-03-30 06:19:53

标签: servlet-filters jsf-2.2 omnifaces

我在我的网络应用程序中使用omnifaces无扩展名URLS。

我的web.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
</context-param>
<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>
<context-param>
    <param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
    <param-value>/*.xhtml</param-value>
</context-param>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>Login.xhtml</welcome-file>
</welcome-file-list>
</web-app>

我的过滤条件如下

@WebFilter(filterName = "AuthFilter", urlPatterns = { "*.xhtml" })
public class AuthenticationFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    try {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        HttpSession ses = req.getSession(false);
        String reqURI = req.getRequestURI();
                    System.out.println(reqURI);
        if (reqURI.indexOf("/Login") >= 0 
                || (ses != null && ses.getAttribute("user") != null)
                || (reqURI.indexOf("/ForgotPassword") >=0)
                || reqURI.contains("javax.faces.resource")) {
            if ((reqURI.indexOf("/Login") >= 0 || (reqURI.indexOf("/ForgotPassword") >=0))
                    && (ses != null && ses.getAttribute("user") != null)) {
                                System.out.println("Invalidating session");
                ses.invalidate();
            }
            chain.doFilter(request, response);
        } else {
            res.sendRedirect(req.getContextPath() + "/Login");
        }
    } catch (Throwable t) {
        System.out.println(t.getMessage());
    }
} // doFilter
}

我的要求是,如果用户登录,则将其重定向到除Login和ForgotPassword页面之外的所有页面。当用户登录并尝试访问其中任何一个页面时,请将其注销并将其发送到所请求的页面。如果用户未登录,则应允许对Login和ForgotPassword页面的所有请求,并且访问任何其他页面应将其重定向到Login页面。

我面临的问题是,使用无扩展名的网址,我可以访问带或不带.xhtml文件扩展名的页面。仅当我使用扩展名访问它时才会调用过滤器。如果没有扩展名,则会绕过过滤器。

我不确定在过滤器类中提供什么URL模式以使其处理每个请求。

请帮助。

1 个答案:

答案 0 :(得分:1)

要么,请听取所有网址:

@WebFilter(urlPatterns = "/*")

或将其附加到FacesServlet

@WebFilter(servletNames = "Faces Servlet")

(请注意,当URL未达到FacesServlet

,这样过滤器就不会运行了)