Thymeleaf 3 URL解析无法使用Spring Boot 4 + Spring Security

时间:2017-01-24 11:51:25

标签: java spring spring-boot spring-security thymeleaf

使用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">

我做了一些调试,首先,在请求期间,我注意到SaveToSessionResponseWrapperSaveContextOnUpdateOrErrorWrapper的子)被初始化为:

public SaveContextOnUpdateOrErrorResponseWrapper(HttpServletResponse response,
        boolean disableUrlRewriting) {
    super(response);
    this.disableUrlRewriting = disableUrlRewriting;
}

传递的参数是FireWalledResponsefalse。后者导致以下方法完全禁止转发URL:

@Override
public final String encodeURL(String url) {
    if (this.disableUrlRewriting) {
        return url;
    }
    return super.encodeURL(url);
}

现在,如果我在构造函数中放置一个断点并强制disableUrlRewritingtrue,它最终会执行HttpServletResponseImpl.isEncodeable,然后在此处失败:

    } else if(hreq.isRequestedSessionIdFromCookie()) {
        return false;

此时我不确定是什么问题。我找不到任何有此错误的人,它既不适用于starter-tomcat也不适用starter-undertow,但我还没有在Tomcat中进行彻底的调试。

2 个答案:

答案 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文章。