2

次のフィルターを使用して、GlassFishをアプリケーションサーバーとして使用してJSF2.0のすべてのページへのアクセスを制御しています。問題は、このコードでは、フィルターは正常に機能し、ユーザーが他のページに直接アクセスしようとするとlog.xhtmlにリダイレクトされますが、login.xhtmlは見栄えがよくない(色付きの画像が表示されず、ページの形状が変更されている)場合です。なれ。ただし、sendRedirectステートメントを削除してchain.doFilterステートメントに置き換えると、ページは見栄えが良くなるはずのように表示されますが、フィルタリングは明らかに機能しません。この問題を解決するにはどうすればよいですか?

LoggingFilter.java

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {   
    HttpServletRequest req = (HttpServletRequest) request;
    LoginBean auth = (LoginBean) req.getSession().getAttribute("loginBean");




    if ((auth != null && auth.isLoggedIn()) || req.getRequestURI().endsWith("/login.xhtml")) {
        // User is logged in, so just continue request.
        HttpServletResponse httpResponse = (HttpServletResponse)response;
        httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0.
        httpResponse.setDateHeader("Expires", 0); // Proxies.
        chain.doFilter(request, response);
    } else {
        // User is not logged in, so redirect to index.
        HttpServletResponse res = (HttpServletResponse) response;
        res.sendRedirect(req.getContextPath() + "/faces/login.xhtml");
        //FacesContext.getCurrentInstance().getExternalContext().dispatch("/login.xhtml");
        //chain.doFilter(request, response);
    }
}
4

1 に答える 1

9

このフィルターは、CSS /JS/画像ファイルのすべてのリクエストをログインページにリダイレクトします。ブラウザは、要求した具体的なCSS / JS /画像コンテンツではなく、ログインページを表すHTMLコードを含む応答を受け取ることになります。そのため、ブラウザは必要なルックアンドフィールの適用に失敗します。

JSFリソース管理(<h:outputStylesheet>など)を100%使用していて、それらがすべて/javax.faces.resource/*URIでカバーされている場合は、フィルターを次のように書き直します。

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);

    LoginBean auth = (session != null) ? session.getAttribute("loginBean") : null;
    String loginURL = request.getContextPath() + "/faces/login.xhtml";

    boolean loggedIn = auth != null && auth.isLoggedIn();
    boolean loginRequest = request.getRequestURI().equals(loginURL);
    boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + "/faces" + ResourceHandler.RESOURCE_IDENTIFIER);

    if (loggedIn || loginRequest || resourceRequest)) {
        if (!resourceRequest) {
            response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
            response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
            response.setDateHeader("Expires", 0); // Proxies.
        }

        chain.doFilter(request, response);
    } else {
        response.sendRedirect(loginURL);
    }
}

リソースリクエストにno-cacheヘッダーを設定しないでください。設定しないと、CSS / JS/imageファイルのブラウザキャッシュの利点が失われます。

于 2013-01-25T17:46:31.083 に答える