使用Gradle配置在Spring Boot 4中配置Thymeleaf 3后
compile('org.springframework.boot:spring-boot-starter-thymeleaf')
compile('org.thymeleaf:thymeleaf:3.0.3.RELEASE')
和
ext['thymeleaf.version'] = '3.0.3.RELEASE'
ext['thymeleaf-layout-dialect.version'] = '2.1.2'
网址解析器无法正确解析Thymeleaf视图中的网址:
<link rel="stylesheet" href="/css/login.css" data-th-href="@{~/css/login.css}">
简单地变成
<link rel="stylesheet" href="/css/login.css">
我做了一些调试,首先,在请求期间,我注意到SaveToSessionResponseWrapper(SaveContextOnUpdateOrErrorWrapper的子)被初始化为:
public SaveContextOnUpdateOrErrorResponseWrapper(HttpServletResponse response,
boolean disableUrlRewriting) {
super(response);
this.disableUrlRewriting = disableUrlRewriting;
}
传递的参数是FireWalledResponse和false
。后者导致以下方法完全禁止转发URL:
@Override
public final String encodeURL(String url) {
if (this.disableUrlRewriting) {
return url;
}
return super.encodeURL(url);
}
现在,如果我在构造函数中放置一个断点并强制disableUrlRewriting
为true
,它最终会执行HttpServletResponseImpl.isEncodeable,然后在此处失败:
} else if(hreq.isRequestedSessionIdFromCookie()) {
return false;
此时我不确定是什么问题。我找不到任何有此错误的人,它既不适用于starter-tomcat
也不适用starter-undertow
,但我还没有在Tomcat中进行彻底的调试。
答案 0 :(得分:1)
你应该使用
<link rel="stylesheet" href="/css/login.css" th:href="@{/css/login.css}">
没有 data-th-href
答案 1 :(得分:0)
@{~/css/login.css}
是Thymeleaf中的服务器相对网址。
如果您需要上下文相关网址,请省略代字号(〜)字符:
<link rel="stylesheet" href="/css/login.css" data-th-href="@{/css/login.css}">
有关详细信息,请参阅Standard URL Syntax文章。