我有一个具有这种结构的项目(我无法改变它):
Web Pages
META-INF
WEB-INF
assets (javascript, css and images)
includes (top.xhtml, bottom.xhtml, etc)
templates (master.xhtml)
views
fornecedor
-home.xhtml
-user.xhtml
-login.xhtml
franqueador
-home.xhtml
-user.xhtml
-login.xhtml
由于某个原因,每个文件夹都有login.xhtml
,我无法更改它,它是由项目经理传递的。
这是我的SessionFilter:
@WebFilter("/views/*")
public class SessionFilter implements Filter {
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
LoginController loginController = (LoginController) ((boolean) (session != null) ? session.getAttribute("loginController") : null);
if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml")) {
if (loginController == null || !loginController.getIsLoggedIn()) {
response.sendRedirect(request.getContextPath()
+ "/views/index.xhtml");
} else {
chain.doFilter(req, res);
}
}
}
}
它不起作用,返回一个没有HTML代码的空白页面,当我将.xhtml
更改为.html
时,它会给我一个重定向循环。
我需要避免所有login.xhtml
页面和index.xhtml
views
文件夹。我在我的过滤器上调试了if
,但它总是返回false
。
修改
按照BalusC的回答,我来到这里:
if (!request.getRequestURI().endsWith("/views/index.html")
&& !request.getRequestURI().endsWith("/views/fornecedor/login.html")
&& !request.getRequestURI().endsWith("/views/franqueado/login.html")
&& (loginController == null || !loginController.getIsLoggedIn())) {
response.sendRedirect(request.getContextPath() + "/views/index.html");
} else {
chain.doFilter(req, res);
}
它正在工作,但还有另一个问题,如果我有10个文件夹,我需要在这个if
语句中添加它们......我需要自动化。
答案 0 :(得分:2)
您的第一个if
条件没有else
。这解释了空白页。
您需要在一个if
中评估网址和登录条件。
if (!request.getRequestURI().endsWith("/fornecedor/index.xhtml") && (loginController == null || !loginController.getIsLoggedIn()) {
response.sendRedirect(request.getContextPath() + "/views/index.xhtml");
} else {
chain.doFilter(req, res);
}
关于重定向循环,这是因为您的FacesServlet
映射到*.html
而不是*.xhtml
的网址格式,原因不明。因此请求URL永远不会匹配。相应地修复过滤器中的URL。要对所有login.html
和index.html
请求进行概括,请执行以下操作:
if (!request.getRequestURI().endsWith("/index.html")
&& !request.getRequestURI().endsWith("/login.html")
&& (loginController == null || !loginController.getIsLoggedIn())
{
response.sendRedirect(request.getContextPath() + "/views/index.html");
} else {
chain.doFilter(req, res);
}