0

我已经为我想要保护的任何页面配置了一个身份验证过滤器。但是,当它尝试重定向到登录页面时,我遇到以下错误

com.sun.faces.context.FacesFileNotFoundException

..这是我的过滤器

@WebFilter(filterName = "Authentication Filter", urlPatterns = { "/pages/*" }, dispatcherTypes = {
        DispatcherType.REQUEST, DispatcherType.FORWARD })
public class AuthenticationFilter implements Filter {
    static final Logger logger = Logger.getLogger(AuthenticationFilter.class);
    private String contextPath;

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        if (httpRequest.getUserPrincipal() == null) {
            httpResponse.sendRedirect(contextPath
                    + "/faces/pages/public/login.xhtml");
            return;
        }
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {
        contextPath = fConfig.getServletContext().getContextPath();
    }
}

..我的 web.xml 被映射到 faces servlet 的这个代码

<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>

不确定,但我已验证该路径存在于我的项目文件夹中

+pages
    +public
        -login.xhtml

生成的路径是

http://localhost:8080/MyApp/faces/pages/public/login.xhtml

有人知道原因吗?

4

2 回答 2

0

异常表明 JSF 无法定位视图。您的项目是否具有以下目录结构:contextRoot/faces/pages/public/login.xhtml

于 2012-12-27T08:52:36.990 回答
0

/faces路径前缀通常由一些 IDE(即 NetBeans)默认添加到 faces url-pattern。您可能已经从 web.xml 更改了它,但您还没有从过滤器 sendRedirect 参数中删除它。

为了使您的过滤器正常工作,请从过滤器中的方法中删除/faces前缀sendRedirect()

httpResponse.sendRedirect(contextPath + "/pages/public/login.xhtml");

或将其添加到 web.xml 中:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
</servlet-mapping>

最后,请注意您的过滤器不会导致无限循环。在重定向之前添加此检查可能很有用:

HttpServletRequest req = (HttpServletRequest) request;
if (!req.getRequestURI().contains("/pages/public/login.xhtml") && httpRequest.getUserPrincipal() == null) {
        // redirect
        return;
    }
于 2012-12-27T09:42:30.290 回答