Web 过滤器破坏 PrimeFaces 移动视图

Posted

技术标签:

【中文标题】Web 过滤器破坏 PrimeFaces 移动视图【英文标题】:Web filter breaks PrimeFaces mobile view 【发布时间】:2013-01-06 03:40:04 【问题描述】:

在我使用 PrimeFaces 3.4.2 的 JSF2.1 Web 应用程序中,我添加了一个新网页,其中仅包含一个带有 renderKitId="PRIMEFACES_MOBILE" (PFM 0.9.3) 的视图。这个想法是过滤器将来自移动设备的请求重定向到此页面。不幸的是,这个过滤器完全破坏了某些移动设备上移动页面的 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>

有关受影响设备的其他信息here。 我没有关于如何调试的提示。我已经使用 Firebug 查看了生成的 html,但无法检测到工作的一个和另一个之间的任何区别。

【问题讨论】:

【参考方案1】:

您需要让过滤器跳过对 CSS/JS/图像文件的 JSF 资源请求。

if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) 
    chain.doFilter(request, response);
    return;

【讨论】:

谢谢,我永远不会自己解决这个问题。为了精确起见,我不得不通过在两者之间添加“/faces”来稍微修改搜索路径。 不客气。在我的所有答案中,我假设 JSF2 映射为 *.xhtml 这个答案+1!在过去的 1.5 年里,我通过在 *** 上阅读了 BalusC 的许多答案,学习了如何使用/编写这样的过滤器逻辑!实际上,我没有使用(也从未使用过)“ResourceHandler.RESOURCE_IDENTIFIER”,但一如既往,你可以从“BalusC”中学到很多东西!!! 还有一件事,忘了注意这一点......您在问题(上图)中提供的代码看起来非常像我的代码,这对我来说很好,但我确实“跳过 JSF 资源请求”在 IF 块内的 CSS/JS/图像文件上。这个答案绝对值得了解!谢谢! @BalusC 我也有类似的问题(***.com/questions/26672592/…)。我把这段代码放在哪里?

以上是关于Web 过滤器破坏 PrimeFaces 移动视图的主要内容,如果未能解决你的问题,请参考以下文章

JSF/PrimeFaces ajax 更新破坏了 jQuery 事件侦听器函数绑定

没有列过滤器的 primefaces 全局过滤器

Primefaces dataTable过滤日期

具有过滤宽度的PrimeFaces SelectOneMenu不正确

过滤后的 Primefaces 数据表排序

上传文件的fileUpload和primefaces空值[重复]