2
我有一个项目,这个结构(我不能改变它):JSF过滤器跳过一些文件
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
声明...我需要使其自动。
您好,感谢您的回答,但怎么样'@WebFilter(“/视图/ *”)'?就这样离开吗? – Gerep
此批注将过滤器注册到应用程序中,并让它在匹配'/ views/*'的URL模式上运行。如果删除它,过滤器将不会被注册,因此根本不会运行。 – BalusC
但在我的情况下,我的'views'文件夹中有一些文件夹,正确的选择是让它这样吗? '@WebFilter(“/ views/*”)' – Gerep