我为我想要保护的任何网页配置了身份验证过滤器。 但是,当它尝试重定向到登录页面时,我遇到以下错误
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使用face 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
有人知道原因吗?
答案 0 :(得分:0)
该异常表示JSF无法找到该视图。您的项目是否具有以下目录结构:contextRoot / faces / pages / public / login.xhtml?
答案 1 :(得分:0)
/faces
路径前缀添加到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;
}