JSF 过滤器跳过一些文件
Posted
技术标签:
【中文标题】JSF 过滤器跳过一些文件【英文标题】:JSF Filter skip some files 【发布时间】:2012-05-12 04:53:00 【问题描述】:我有一个具有这种结构的项目(我无法更改):
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
是有原因的,我不能更改它,它是由项目经理传递的。
这是我的会话过滤器:
@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
。
编辑
按照 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
语句中......我需要让它自动。
【问题讨论】:
【参考方案1】:您的第一个if
条件没有else
。这就解释了空白页。
您需要在单个 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
而不是*.xhtml
的URL 模式,原因不明。所以请求 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 模式上运行。如果您删除它,过滤器将根本不会注册,因此根本不会运行。
但在我的情况下,我的views
文件夹中有一些文件夹,正确的选择是这样吗? @WebFilter("/views/*")
它将在每个匹配 /views/*
的 URL 模式上运行,因此也将在 /views/someotherfolder/file.xhtml
上运行。但是,我再次阅读了您的问题,似乎您实际上在每个文件夹中也有一个 index.xhtml
(即使您没有在文件夹结构示例中显示它)并且您想以与login.xhtml
相同的方式对待index.xhtml
。这是真的?也不清楚您的 FacesServlet
映射到什么 URL 模式。是*.xhtml
还是*.html
?过滤器中检查的请求 URL 和重定向的 URL 必须与该 URL 模式完全匹配。
我的文件夹中没有index.xhtml
,只有views
,URL 格式为html
以上是关于JSF 过滤器跳过一些文件的主要内容,如果未能解决你的问题,请参考以下文章