Thymeleaf 3 URL 解析不适用于 Spring Boot 4 + Spring Security
Posted
技术标签:
【中文标题】Thymeleaf 3 URL 解析不适用于 Spring Boot 4 + Spring Security【英文标题】:Thymeleaf 3 URL resolving not working with Spring Boot 4 + Spring Security 【发布时间】:2017-06-09 05:08:02 【问题描述】:在 Spring Boot 4 中使用 Gradle 配置配置 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 中进行彻底的调试。
【问题讨论】:
您期望它解决什么问题? @holmis83 一个上下文相关的 URL 【参考方案1】:@~/css/login.css
是 Thymeleaf 中的 服务器相关 URL。
如果您想要 上下文相关 URL,请省略波浪号 (~) 字符:
<link rel="stylesheet" href="/css/login.css" data-th-href="@/css/login.css">
详见Standard URL Syntax文章。
【讨论】:
如果我使用它,它仍然会转换为/css/login.css
。无论我尝试什么 URL,都会发生同样的事情。【参考方案2】:
你应该使用
<link rel="stylesheet" href="/css/login.css" th:href="@/css/login.css">
没有data-th-href
【讨论】:
与那个相同的问题,它根本无法解决。我什至不明白为什么disableUrlRewriting
被设置为 true。以上是关于Thymeleaf 3 URL 解析不适用于 Spring Boot 4 + Spring Security的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 不适用于 bootstrap 4 + thymeleaf
CSS 样式表不适用于 Spring Security + Spring Boot + Thymeleaf
Spring Boot + Thymeleaf css 不适用于模板