JSF过滤器跳过一些文件
我有一个具有此结构的项目(我无法更改): O每个文件夹都有一个JSF过滤器跳过一些文件,jsf,servlet-filters,Jsf,Servlet Filters,我有一个具有此结构的项目(我无法更改): O每个文件夹都有一个login.xhtml,由于某种原因,我无法更改它,它是由项目经理传递的 这是我的会话筛选器: @WebFilter("/views/*") public class SessionFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) t
login.xhtml
,由于某种原因,我无法更改它,它是由项目经理传递的
这是我的会话筛选器:
@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
页面和views
文件夹中的index.xhtml
。我已经在我的过滤器上调试了if
,但它总是返回false
编辑
根据巴卢斯克的回答,我得出以下结论:
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
语句中…我需要使其自动。如果条件没有其他,您的第一个。这解释了空白页。
您需要在单个if
中评估URL和登录条件
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
的URL模式,而不是*.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);
}
您好,谢谢您的回答,但是@WebFilter(“/views/*”)
呢?就这样吧?此注释在应用程序中注册过滤器,并允许它在匹配/views/*
的URL模式上运行。如果删除此选项,则筛选器将根本不会注册,因此根本不会运行。但在我的情况下,我的视图
文件夹中有一些文件夹,正确的选择是将其保留为这种方式@WebFilter(“/views/*”)
它将在与/views/*
匹配的每个URL模式上运行,因此也将/views/someotherfolder/file.xhtml
。但是,我再次阅读了您的问题,似乎您实际上在每个文件夹中都有一个index.xhtml
(即使在文件夹结构示例中没有显示),并且您希望以与login.xhtml
相同的方式处理index.xhtml
。这是真的吗?您的FacesServlet
映射到什么URL模式也不清楚。它是*.xhtml
还是*.html
?筛选器中选中的请求URL和重定向的URL必须与该URL模式完全匹配。我的文件夹中没有索引.xhtml
,只有视图中的和URL模式是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);
}