#html #css #spring #thymeleaf
#HTML #css #весна #thymeleaf
Вопрос:
У меня есть проект Spring Boot. Я использую Spring Security с этой конфигурацией:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests(authorize -> authorize
.antMatchers("/static/**", "/index").permitAll()
.antMatchers("/premium/**").hasAnyAuthority("ADMIN","PREMIUM")
.antMatchers("/user/**").hasAnyAuthority("ADMIN","PREMIUM","USER")
)
.formLogin()
.loginPage("/login")
.failureUrl("/login-error")
.defaultSuccessUrl("/index")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/index")
.permitAll();
}
Это моя структура для HTML-страниц.
resources
static
css
style.css
templates
index.html
error_page.html
premium
premium.html
Во всех HTML-файлах у меня css загружен таким образом:
<link rel="stylesheet" type="text/css" href="css/style.css">
Когда я открываю каждую из страниц отдельно, css загружается, и все работает правильно.
Проблема возникает, когда пользователь с ролью «ПОЛЬЗОВАТЕЛЬ» пытается получить доступ к premium.html . Spring показывает error_page с кодом ошибки 403. Но эта страница с ошибкой находится на premium.html URL-АДРЕС. Другими словами, строка URL показывает www.domain/premium.html но содержимое страницы — это содержимое страницы с ошибкой. Таким образом, ресурсы не загружаются с этой ошибкой:
Failed to load resource: the server responded with a status of 403 () http://domain/premium/css/style.css
A пытался использовать th:href, но безуспешно.
<link rel="stylesheet" type="text/css" th:href="@{css/style.css}">
Как я могу это исправить?
Комментарии:
1. Вы пробовали указывать
"/static/css/**"
. Как вы уже упоминали, это означает, что 403 означает, что spring security не разрешает доступ.2. Попробуйте это и дайте мне знать.
3. Все то же самое. Проблема в том, что страница ищет ресурсы в /premium/css/style.css, где их явно нет.
Ответ №1:
Проблема в том, что страница ищет ресурсы в /premium/css/style.css, где их явно нет
Чего вам не хватает, так это одной косой /
черты .
Вместо:
<link rel="stylesheet" type="text/css" th:href="@{css/style.css}">
…пожалуйста, сделайте:
<link rel="stylesheet" type="text/css" th:href="@{/css/style.css}">
Как указано в документации Thymeleaf:
Относительные URL-адреса, начинающиеся с
/
(например:/order/details
), будут автоматически иметь префикс имени контекста приложения.
Таким образом, ваша ссылка будет относиться к контексту приложения ( http://domain/
) и указывать на соответствующую папку.