Thymeleaf 3.1‌版本的内置对象禁用

一、为什么禁用内置对象?

  1. 安全性提升‌:自动注入这些对象可能使得开发者更容易在不安全的情况下使用它们,例如在不进行适当验证或清理的情况下输出用户输入。

  2. 减少XSS和CSRF风险‌:通过限制这些对象的自动注入,Thymeleaf鼓励开发者在使用这些对象时更加小心,比如在输出用户输入时进行适当的HTML转义,或者在处理表单请求时使用CSRF令牌。

二、手动添加内置对象

  1. 手动注入内置对象:通过WebContext.setVariable()显式传递HttpServletRequest、HttpSession、ServletContext、Locale、ServletConfig、PrintWriter等对象
  2. 兼容Servlet 6.0:使用@WebServlet注解声明Servlet,支持Servlet 6.0规范
  3. Thymeleaf 3.1.2兼容:使用ClassLoaderTemplateResolver加载模板文件
  4. 模板路径:默认加载resources/templates/目录下的HTML文件
  5. 内置对象禁用解决方案:通过手动注入避免Thymeleaf默认禁用内置对象
  6. 直接运行:部署到Servlet容器(如Tomcat)即可访问/thymeleaf路径
  7. 安全性:避免自动注入潜在安全风险,显式控制对象传递
  8. 简洁高效:核心代码仅20行,实现Servlet+Thymeleaf集成
  9. 扩展性:支持添加更多内置对象(如request、session、application、locale等)

三、在CustomTemplateEngine类中手动添加

java 复制代码
/**
     * 处理模板文件
     * @param templateName 模板文件的名称
     * @param request 请求对象
     * @param response 响应对象
     * @throws IOException IO异常
     */
    public void processTemplate(String templateName, HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 创建IServletWebExchange对象
        IServletWebExchange webExchange = application.buildExchange(request, response);
        // 创建WebContext对象
        WebContext context = new WebContext(webExchange, webExchange.getLocale());

        //Thymeleaf 3.1.2‌:禁用了内置对象(如#request、#session等)的默认支持。
        //内置对象禁用:通过 WebContext 传递数据变量,避免使用内置对象
        // 手动添加request对象
        context.setVariable("request", request);
        context.setVariable("response", response);
        context.setVariable("session", request.getSession());
        context.setVariable("application", request.getServletContext());

        // 设置响应体内容类型和字符集
        response.setContentType("text/html;charset=UTF-8");
        // 处理模板数据
        templateEngine.process(templateName, context, response.getWriter());
    }

四、HTML页面

html 复制代码
<!DOCTYPE html>
<!--导入thymeleaf包-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>内置对象</h1>
Established locale country: <span th:text="${#locale.country}">US</span>.
<!-- 上下文对象示例 -->
<p>当前语言: <span th:text="${#locale.language}"></span></p>

<p>当前时间: <span th:text="${#dates.format(#dates.createNow(), 'yyyy-MM-dd HH:mm:ss')}">时间</span></p>
<p>请求URI: <span th:text="${request.requestURI}">请求URI</span></p>
<p>会话ID: <span th:text="${session.isEmpty()}">会话</span></p>
<p>请求方法: <span th:text="${request.method}">请求方法</span></p>
<p>请求方法: <span th:text="${request.getMethod()}">请求方法</span></p>
<p>请求路径: <span th:text="${request.getContextPath()}">请求路径</span></p>
<p>响应头信息: <span th:text="${response.getContentType()}">响应头信息</span></p>

运行效果:

相关推荐
WL_Aurora10 小时前
Hadoop 通过 Web 界面上传文件到 HDFS 失败解决方案
hadoop·hdfs
i建模10 小时前
在数据仓库(数仓)中,给数据打标签(Tagging)
数据仓库
ClouderaHadoop1 天前
CDH 最隐蔽的坑:NTP 时间同步导致的 5 类故障
hadoop·hbase·kerberos·cloudera·cdh
Gent_倪1 天前
Hadoop生态组件介绍
大数据·hadoop
地球资源数据云1 天前
1900-2023年中国物种分布点位矢量数据集
大数据·数据结构·数据库·数据仓库·人工智能
YaBingSec1 天前
玄机网络安全靶场:Hadoop YARN ResourceManager 未授权 RCE WP
大数据·数据库·hadoop·redis·笔记·分布式·web安全
Leo.yuan1 天前
数据仓库是什么?数据仓库和大数据平台、数据湖、数据中台、湖仓一体有什么区别?
大数据·数据仓库·spark
哥本哈士奇2 天前
数据仓库笔记 第六篇:PSA 层 SCD2 处理方式
数据仓库
曹牧2 天前
Java Web 开发:servlet-mapping‌
java·数据仓库·hive·hadoop
juniperhan2 天前
Flink 系列第20篇:Flink SQL 语法全解:从 DDL 到 DML,窗口、聚合、列转行一网打尽
大数据·数据仓库·分布式·sql·flink