我正在开发一个工作正常的项目,直到我决定实施过滤。 我在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>
当我删除过滤器时,一切正常。
答案 0 :(得分:2)
该答案基于*.xhtml
的FacesServlet映射。但是,你有/faces/*
的旧JSF 1.0 / 1.1样式映射。换句话说,FacesServlet永远不会被调用,你只是看到后果。
你有两个选择:
修复过滤器以重定向到与FacesServlet映射匹配的URL。
res.sendRedirect(req.getContextPath() + "/faces/login.xhtml");
将FacesServlet映射更改为*.xhtml
,就像每个理智的JSF 2.x开发人员所做的那样。这样可以避免您一直摆弄虚拟URL。
无关,如果您打算让过滤器挂钩在特定的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();