3

PrimeFaces3.4.2を使用するJSF2.1Webアプリケーションで、renderKitId="PRIMEFACES_MOBILE"(PFM 0.9.3)を含む1つのビューのみを含む新しいWebページを追加しました。アイデアは、フィルターがモバイルデバイスからのリクエストをこのページにリダイレクトすることです。残念ながら、このフィルターは一部のモバイルデバイスのモバイルページのCSSを完全に破壊しています(はい、すべてのデバイスが影響を受けるわけではありません!)。フィルタが存在する場合、影響を受けるデバイスでは、リダイレクトされた呼び出しと直接の呼び出しのいずれかが壊れます。フィルタがオフの場合、すべてが正常に機能します。

ここにウェブフィルターがあります:

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain)
        throws IOException, ServletException {

    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;

    boolean isMobile = isMobileDevice(req.getHeader("user-agent"));  // utility function

    if (!req.getRequestURI().contains("/mobile/") && isMobile) {
        resp.sendRedirect(req.getContextPath() + "/faces/mobile/index.xhtml");
    } else {
        chain.doFilter(request, response);
    }    
}

フィルタには、web.xmlにマッピングがありません。注釈のみ@WebFilter("/*")が存在します。注釈内のパスが偽造されている場合、すべてが正常に機能します。

xhtmlページは...かなり単純です:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:p="http://primefaces.org/ui"
      xmlns:pm="http://primefaces.org/mobile" >
    <h:head>
    </h:head>
    <h:body>
        <f:view renderKitId="PRIMEFACES_MOBILE">
            <pm:page title="Hello World">
                <pm:view id="main">
                    <pm:header title="Header" />
                </pm:view>
            </pm:page>        
        </f:view>    
    </h:body>
</html>

影響を受けるデバイスに関する追加情報はこちら。これをデバッグする方法についてのヒントはありません。Firebugを使用して生成されたhtmlを調べましたが、動作しているHTMLと動作しているHTMLの違いを検出できませんでした。

4

1 に答える 1

10

フィルターが CSS/JS/image ファイルの JSF リソース要求をスキップできるようにする必要があります。

if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
    return;
}
于 2013-01-22T20:10:24.637 に答える