簡體   English   中英

如何在freemarker中實現字符串的MD5哈希

[英]how to implement MD5 hashing of a string in freemarker

我正在使用Smooks for EDI Translations開發freemarker模板

我只是對16位十六進制格式的字符串執行MD5哈希處理。

我無法在Freemarker邏輯中找到實現Md5哈希的相關語法

嘗試導入時

#import java.security.MessageDigest

在smooks-config.xml文件中的freemarker中,它引發錯誤

原因:freemarker.template.TemplateNotFoundException:找不到名稱為“ java.security.MessageDigest”的模板

FreeMarker模板只能#import其他FreeMarker模板(請參閱文檔 )。 同樣,通常,您不應該在FreeMarker模板中計算這些東西。 您應該將已經計算出的十六進制字符串傳遞給模板。

但是,如果您不能執行上述操作,則可以用Java編寫一個具有所需方法的小型實用程序對象,然后將其作為“共享變量”添加到FreeMarker數據模型或FreeMarker配置中。 但是,我不知道Smooks是否足以進行配置。

如果Smooks不允許您對FreeMarker進行太多配置(如上所述),則可以用Java編寫TemplateMethodModel實現來計算所需的值,然后在模板中創建該實例作為<#assign md5 = 'com.example.MyMD5Method'?new()> ,然后可以在FreeMarker中執行${md5(something)}的操作。 (當然,這要求您可以向應用程序中添加新類。)

如果Md5哈希可以通過給定類的靜態方法執行,並且您確實不能處理模板之前完成此工作則可以將該類暴露給模板。

我不熟悉Smooks,但基本上您需要告訴Smooks注入經過修改的FreemarkerManager ,該方法具有重寫方法populateContext

public class MyFreemarkerManager extends FreemarkerManager {
    @Override
    protected void populateContext(ScopesHashModel model, ValueStack stack, Object action, HttpServletRequest request, HttpServletResponse response) {

        super.populateContext(model, stack, action, request, response);
        BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_24).build();
        TemplateHashModel staticModels = beansWrapper.getStaticModels();
        TemplateHashModel utils = (TemplateHashModel)staticModels.get("path.to.your.class.Utils");
        model.put("Utils", utils);
    }
}

現在,您所有的模板都可以直接訪問Utils類的靜態方法

${Utils.hashMd5(s)}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM