Freemarker - HTTPSession 属性返回 null
Posted
技术标签:
【中文标题】Freemarker - HTTPSession 属性返回 null【英文标题】:Freemarker - HTTPSession attribute returning null 【发布时间】:2019-07-17 01:19:51 【问题描述】:我们有一个基于球衣的网络应用程序。我们将 Apache Freemarker 用于前端网页。我创建了一个 servlet 过滤器并将其添加到 web.xml 中。 此过滤器拦截所有 http 请求。在该过滤器的 doFilter 方法中,我从请求对象中获取 HTTPSession 并设置 一个属性值。说“myVal”。
myVal 现在应该在 HTTPServletRequest 中的 HTTPSession 上设置。如何在 FTL 页面中访问这个 myVal。 我试图找到一些关于如何检索的帖子 会话,它总是返回 null。
我已将 Freemarker 更新到最新版本:2.3.28
我还尝试将 Freemarker 文档中提到的 servlet[1] 添加到我的 web.xml。
尝试了以下方式访问myVal:
$Request.myVal
$myVal
$Request.Session.myVal
$Session.myVal
以上所有值均为“null”并抛出以下异常
FreeMarker 模板错误(调试模式;在生产中使用 RETHROW!):以下已评估为 null 或缺失:==> 请求 [in template "home.ftl" at 第 18 行,第 3 列]
---- 提示:如果已知失败的表达式合法地引用了有时为 null 或缺失的内容,请指定一个默认值,如 myOptionalVar!myDefault, 或使用 when-presentwhen-missing。 (这些仅涵盖表达式的最后一步;要涵盖整个表达式,请使用括号: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL 堆栈跟踪(“~”表示与嵌套相关): - 失败于:$Request.Session.user_privilages [在第 18 行第 1 列的模板“home.ftl”中]
【问题讨论】:
FreeMarker 是如何配置的?它是如何调用的?它应该如何知道请求和/或会话对象?或者任何其他值? 在应用程序启动时,我们这样做: register(FreemarkerMvcFeature.class);在资源配置上。我们使用 jersey-mvc-freemarker jar。从前端我们对我们的 REST 服务器进行 ajax 调用,它返回一个带有 ftl 名称和所有需要的详细信息的 Viewable。 【参考方案1】:据我在source code 中看到的,jersey-mvc-freemarker
不会向 FreeMarker 模型添加任何额外的值。
这意味着它只能看到您添加的内容。如果想让模板看到Session
,则需要在模型中添加Session
。
【讨论】:
根据 freemarker documentation .. 看起来我们可以访问 FTL 页面中的请求对象 @HarshaThota 这个问题是关于使用jersey-mvc-freemarker
库向 Jersey MVC 框架添加对 FreeMarker 模板的“视图”支持,并且与制作 FreeMarker没有任何关系模板的行为类似于 Servlet 容器中的 JSP,这就是该文档的内容。以上是关于Freemarker - HTTPSession 属性返回 null的主要内容,如果未能解决你的问题,请参考以下文章