FreeMarker 模板加载器返回 302 Found

Posted

技术标签:

【中文标题】FreeMarker 模板加载器返回 302 Found【英文标题】:FreeMarker template loader returns 302 Found 【发布时间】:2015-12-11 16:32:04 【问题描述】:

FreeMarker 返回模板的以下内容:

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://someOtherUrl">here</a>.</p>
</body></html>

这根本不可能发生。 FreeMaker 是如何获得它的? FreeMarker 配置已创建并使用:

    Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
    ...
    @PostConstruct
    void init()
    
        configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());
        configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        configuration.setTemplateLoader(new TemplateLoader());
        configuration.setLocale(Locale.ENGLISH);
    
...
   Template temp = configuration.getTemplate(sourceTemplateUrl);

我可以摆脱这种“聪明”的行为吗?

编辑:

public class TemplateLoader extends URLTemplateLoader

    private static final String LOCAL_PREFIX = "_" + Locale.ENGLISH;

    @Override
    protected URL getURL(final String url)
    
        try
        
            //get rid of "_en" in the url, FreeMarker set it based on Locale
            return new URL(url.replace(LOCAL_PREFIX, ""));
        
        catch (MalformedURLException e)
        
            throw new RuntimeException(e);
        
    

【问题讨论】:

@AleksandrM,我已将代码发布到问题中 【参考方案1】:

该页面不是由 FreeMarker 生成的。 FreeMarker 没有 HTTP 魔法,它只是生成文本。 (当然,如果您让 FreeMarker 从返回此文本的 URL 加载模板,那么它在技术上来自 FreeMarker。)

另外,您的TemplateLoader 对我来说似乎不起作用,因为您只是从相对路径创建 URL-s(更新:您正在传递完整的 URL-s,因此它可以工作,但您也必须处理 HTTP 响应代码)。但是无论如何,您不应该在那里进行此类名称更改。如果您不想本地化查找,只需将其关闭:

configuration.setLocalizedLookup(false);

或者,如果您需要更复杂的操作,请查看configuration.setTemplateLookupStrategy

【讨论】:

谢谢。在 TemplateLoader 中应该做什么。客户端只发送 url,FreeMarker 加载模板位于此 URL。在这堂课上我还应该做什么?在调用 configuration.getTemplate(someUrl); 之后,有没有办法在 FreeMarker 配置中获取响应代码? ? 我刚刚意识到您将完整的 URL-s 传递给 getTemplate。不寻常(并考虑到安全隐患),但它应该可以工作。 FreeMarker 本身不会处理 HTTP 响应代码(或任何 HTTP 特定的代码)。您必须将这些知识编程到您的 TemplateLoader(请参阅 JavaDocs 和其他文档)中,因为它特定于存储机制。比如,如果 URL 返回 HTTP 404,findTemplateSource 应该返回 null

以上是关于FreeMarker 模板加载器返回 302 Found的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot + Apache Camel + Freemarker 自定义模板加载器

Freemarker 模板加载

在 Freemarker 模板中加载模板而不为模板加载设置目录或类

在 java 中加载 freemarker 模板时出现 FileNotFoundException

从数据库加载 FreeMarker 模板

在 Spring 应用程序中从 FreeMarker 获取模板文本