我要求我要与freemaker一起实施,我已经知道freemarker是如何工作的,就像这样
template.process(dataMap,out);
dataMap包含我们用来填充模板的数据,当然所有数据都实现了TamplateModel接口,如果我们使用用户定义的指令没有区别,因为用户定义的指令实现了TemplateDirectiveModel,这个接口实现了TemplateModel,我需要做的是访问存储在会话中的数据,然后在我的指令中使用这些数据。就像这个<@authCheck> </@authCheck>
一样,我的auth数据存储在会话中,所以我需要在我的指令中从会话中获取这些数据
ps:我使用springMVC和freemarker
答案 0 :(得分:1)
模板的运行时环境由Environment
对象表示,您也可以将其作为TemplateDirectiveModel
- s的参数获取,或者可以使用静态方法Environment.getCurrentEnvironment()
从TLS获取。您可以使用setCustomAttribute(String name, Object value)
将其他对象(例如会话)附加到环境中,这样您的指令就可以通过env.getCustomAttribute(name)
获取它。
每次Template.process
调用都会在内部生成自己的Environment
对象。要在调用主模板之前访问它,您必须执行此操作,而不是简单地调用Tempalte.process
:
Environment env = myTemplate.createProcessingEnvironment(root, out);
env.setCustoomAttribute("session", sesssion);
// You can addjust other environment settings here too.
env.process(); // template is called here to render the output
另一种可能性是将会话置于数据模型中。 TemplateDirective
- s可以通过env.getDataModel()
访问数据模型。
答案 1 :(得分:1)
注意:我的回答没有直接回答这个问题。
正如你所提到的,你使用Freemarker和Spring-MVC,我猜你也使用Spring-Security,如果没有,建议你这样做。
以下是我在Freemarker模板中使用Spring-Security taglib的方法。
<#macro auth expr>
<#assign security=JspTaglibs["http://www.springframework.org/security/tags"] />
<@security.authorize access=expr>
<#nested>
</@security.authorize>
</#macro>
以上的宏可以像:
一样使用<#import "/mywebsitename/foomacro.ftl" as foo>
<@foo.auth "isAnonymous()">
<a href="/signup">Signup</a>
</@foo.auth>
<@foo.auth "hasRole('ROLE_USER')">
<a href="/profile">Profile</a>
</@foo.auth>
我也很高兴知道我方法的弱点,例如我们可以通过使用其他方法获得更好的性能吗?
例如,这个虚构的代码可能表现得更好吗?
<@foo.authCheck AUTH_OBJ_IN_SESSION "ROLE_USER">
<a href = '/profile'>Profile</a>
</@foo.authCheck>
<#macro authCheck authObj role>
<#if authObj.hasRole(role)>
<#nested>
</#if>
</#macro>
我自己的猜测是,它们没有太大区别,因为它们都使用来自用户会话的身份验证对象。那么为什么不使用Spring-Security的测试(即用型)taglib?
P.S。我通常在模板中访问SESSION变量,就像模型或请求变量一样,例如${VAR_IN_SESSION}
。也许那是因为我在我的春季配置中设置了<property name="exposeSpringMacroHelpers" value="true"/>
。我也有<property name="exposeSessionAttributes" value="false"/>
,它似乎对不提供会话变量没有影响!