4

JSF2プロジェクトに取り組んでいます。login.xhtmlページをweb.xmlのエントリページとして定義しました

    <welcome-file-list>
        <welcome-file>login.xhtml</welcome-file>
    </welcome-file-list>

また、ユーザーがログインしているかどうかを確認するためのフィルターもあります

    @WebFilter(filterName = "loginCheckFilter", urlPatterns={"/*"})
    public class LoginCheckFilter implements Filter
    {
        @Inject
        private LoginStatus loginStatus;

        public void do Filter(...)
        {
            try{
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;

            String path = req.getRequestURI();
            if(StringUtils.isNotBlank(path)
               && StringUtils.contains(path, ".xhtml")
               && !StringUtils.endsWith(path, "login.xhtml"))
             {
                    if(loginStatus == null
                       || !loginStatus.isLoggedIn())
                     {
                          res.sendRedirect(req.getContextPath() + "/login.xhtml");
                      }
                     else
                      {
                           chain.doFilter(request, response);
                       }
              }
              else
              {
                  chain.doFilter(request, response);
               }
            }catch (Exception ex)
             {
                  log.error(ex);
              }
           }

        .... ....
        }

私のcssファイルは次のスタイルで参照されました:

    <link href="css/styles.css" rel="stylesheet" type="text/css"/>

css参照スタイルをJSF2リソースハンドラー(http://www.mkyong.com/jsf2/resources-library-in-jsf-2-0/)に変更するまで、すべてが正常に機能します。すべてのcssファイルをresourcesフォルダーにコピーし、ライブラリ名とバージョン番号を指定しました。だから今私は次のようにcssを参照します:

    <h:outputStylesheet library="default" name="css/styles.css"/>

変更後、login.xhtmlはスタイルシートをレンダリングしなくなります。login.xhtmlページの直後にwelcome.xhtmlページがあります。これは、コアコンテンツを除いてほぼ同じ構造ですが、このページは完全に正常にレンダリングされます。login.xhtmlを更新しましたが、レンダリングされません。しかし、ログインしたら、次のページに進み、login.xhtmlに戻って更新すると、スタイルがレンダリングされます。また、loginCheckFilterを外すと、login.xhtmlがスタイルシートをレンダリングします。それで、誰かが同様の状況に遭遇し、それを解決する方法を知っている場合はどうなりますか?ありがとう!

4

1 に答える 1

5
urlPatterns={"/*"}

フィルタは、JSFリソースへのリクエストもブロックしています。

JSFリソース要求を許可するように、フィルターを書き直す必要があります。

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {    
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    String loginURL = request.getContextPath() + "/login.xhtml";

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

    if (loggedIn || loginRequest || resourceRequest)) {
        if (!resourceRequest) { // Prevent restricted pages from being cached.
            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);
    }
}
于 2013-02-27T00:50:58.057 に答える