过滤器实现后不呈现JSF标记

时间:2015-02-12 16:47:42

标签: jsf-2 primefaces

我正在开发一个工作正常的项目,直到我决定实施过滤。 我在BalusC's上发帖 JSF HTTP Session Login 。 现在,没有渲染任何jsf标记。这是我的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>
<filter>
    <filter-name>UserFilter</filter-name>
    <filter-class>servlet.UserFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>UserFilter</filter-name>
    <url-pattern>/faces/*</url-pattern>
</filter-mapping>
<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>ImageServlet</servlet-name>
    <servlet-class>servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ImageServlet</servlet-name>
    <url-pattern>/ImageServlet</url-pattern>
</servlet-mapping>
<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>
<welcome-file-list>
    <welcome-file>faces/admin/login.xhtml</welcome-file>
</welcome-file-list>
<context-param>
    <param-name>primefaces.THEME</param-name>
    <param-value>blitzer</param-value>
</context-param>

当我删除过滤器时,一切正常。

1 个答案:

答案 0 :(得分:2)

该答案基于*.xhtml的FacesServlet映射。但是,你有/faces/*的旧JSF 1.0 / 1.1样式映射。换句话说,FacesServlet永远不会被调用,你只是看到后果。

你有两个选择:

  1. 修复过滤器以重定向到与FacesServlet映射匹配的URL。

    res.sendRedirect(req.getContextPath() + "/faces/login.xhtml");
    
  2. 将FacesServlet映射更改为*.xhtml,就像每个理智的JSF 2.x开发人员所做的那样。这样可以避免您一直摆弄虚拟URL。

  3. 另见:


    对于具体问题

    无关,如果您打算让过滤器挂钩在特定的servlet上,最好不要复制其URL模式,如下所示:

    <filter-mapping>
        <filter-name>UserFilter</filter-name>
        <url-pattern>/faces/*</url-pattern>
    </filter-mapping>
    

    相反,您最好直接映射到servlet名称:

    <filter-mapping>
        <filter-name>UserFilter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>
    

    而且,如果您在过滤器和servlet名称中遵循Java变量命名约定也是很好的:

    <filter-name>userFilter</filter-name>
    ...
    <servlet-name>facesServlet</servlet-name>
    

    把它想象成你这样做:

    UserFilter userFilter = new UserFilter();