Spring error_page не удается загрузить css

#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/ ) и указывать на соответствующую папку.