Liferay7.0/7.4中Freemarker模板${device}无法返回设备数据求助
Freemarker ${device} 变量返回全unknown的解决办法
问题还原
模板中${device}返回的设备数据全部为unknown(仅qwertyKeyboard和tablet有值),输出内容如下:
{brand=unknown, browser=unknown, browserVersion=unknown, model=unknown, os=unknown, osVersion=unknown, pointingMethod=unknown, qwertyKeyboard=true, screenPhysicalSize={height=-1.0, width=-1.0}, screenResolution={height=-1.0, width=-1.0}, tablet=false}
解决步骤
检查请求头传递
Freemarker本身不具备设备检测能力,device变量依赖后端通过User-Agent请求头解析设备信息。需确认:- 后端能正常获取到浏览器发送的
User-Agent头,反向代理(如Nginx)需配置保留该请求头,避免被过滤或篡改。 - 在后端打印请求头日志,验证
User-Agent是否存在且格式正常。
- 后端能正常获取到浏览器发送的
排查设备检测依赖库
如果使用了第三方设备检测库(如DeviceDetector、UserAgentUtils):- 确认库版本是否为最新,旧版本数据库无法识别新设备/浏览器。
- 检查库的配置文件(如DeviceDetector的设备识别yaml库)是否正确加载,是否需要定期更新设备数据。
验证变量注入逻辑
检查后端代码中device对象的注入流程:- 确认设备检测结果已正确封装为
device对象,并放入Freemarker的模板上下文(如ModelAndView、Configuration变量配置)。 - 排查是否存在逻辑错误(如空指针、默认值覆盖)导致所有设备字段被设为unknown。
- 确认设备检测结果已正确封装为
手动测试检测逻辑
拿真实的User-Agent字符串(例如Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1)直接传入后端检测方法:- 若解析失败,说明是检测库本身的问题;若解析正常,说明是模板上下文注入环节出错。
排查特殊环境干扰
- 本地测试时,检查是否有浏览器插件、代理工具修改了
User-Agent,导致检测失效。 - 确认防火墙、安全软件未拦截请求头的正常传递。
- 本地测试时,检查是否有浏览器插件、代理工具修改了
内容的提问来源于stack exchange,提问作者Hani
相关产品推荐
相关产品推荐

