2

この構造のプロジェクトがあります(変更できません):

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.xhtmlonviewsフォルダーを避ける必要があります。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ステートメントにそれらを追加する必要があります...自動化する必要があります。

4

1 に答える 1

2

最初のif条件にはありませんelse。それは空白のページを説明しています。

代わりに、URLとログイン条件を1つで評価する必要があります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、のURLパターンにマッピングされているためです。したがって、リクエストURLが一致することはありません。それに応じてフィルターのURLを修正します。すべてとリクエストに対して一般化するには、次のようにします。*.html*.xhtmllogin.htmlindex.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);
}
于 2012-05-02T17:17:13.753 に答える