在使用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>
有关受影响设备的其他信息,请参阅此处。我没有关于如何调试它的提示。我已经使用 Firebug 查看了生成的 html,但无法检测到工作版本与另一个版本之间的任何差异。
你需要让过滤器跳过 CSS/JS/image 文件上的 JSF 资源请求。
if (req.getRequestURI().startsWith(req.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
chain.doFilter(request, response);
return;
}