Spring Boot с приложением Spring Security вызывает контроллер входа в систему при загрузке домашней страницы

У меня есть приложение Spring Boot с Spring Security. На базовом уровне он в значительной степени соответствует тому, что было в учебнике Spring. Мой вопрос в том, что когда я попадаю на домашнюю страницу, он вызывает контроллер входа в систему (дважды). Почему? Не совсем очевидно, что он делает это с базовой настройкой, поскольку он просто показывает домашнюю страницу. Но если я добавлю класс LoginController, он будет вызываться (дважды) при загрузке домашней страницы. Другой способ убедиться в этом — добавить недопустимый тег тимелеафа в шаблон login.html, он выдаст ошибку, даже если домашняя страница не должна быть аутентифицирована. Любое объяснение будет полезным.

Мой код:

Заявление:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Конфигурация веб-безопасности:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

Домашний контроллер:

@Controller
public class HomeController {
    @RequestMapping(value="/", method=RequestMethod.GET)
    public String getHomePage(Model model) {
        return "home";
    }
}

Необязательный LoginController будет вызываться при переходе на домашнюю страницу:

@Controller
public class LoginController {
    @RequestMapping(value="/login", method=RequestMethod.GET)
    public String getLoginPage(Model model) {
        return "login";
    }
}

person ikcodez    schedule 23.08.2016    source источник
comment
Как вы подтвердили, что контроллер входа в систему был вызван дважды при загрузке домашней страницы? Из журналов? (если да, то не могли бы вы поделиться логами).   -  person rhinds    schedule 24.08.2016
comment
поставьте точку останова или просто оператор печати... на самом деле он вызывается один раз, в моем html должно быть что-то, из-за чего он вызывается дважды, но теперь он вызывается один раз.   -  person ikcodez    schedule 24.08.2016


Ответы (1)


Вероятно, вам следует добавить a RequestMapping в LoginController.

Но зачем вам HomeController и LoginController, если у вас уже есть эти сопоставления в addViewControllers?

person storm_buster    schedule 23.08.2016
comment
извините, плохое форматирование... поправил. Тем не менее, вопрос в том, почему вызывается контроллер входа в систему и, что еще более важно, почему он отображает шаблон login.html (или, кажется, делает это дважды)? - person ikcodez; 23.08.2016
comment
возможно, это связано с любой ссылкой, которая есть в вашем шаблоне входа/дома. например, у вас может быть ссылка на файл image/js/css, который заблокирован вашей конфигурацией безопасности. - person storm_buster; 23.08.2016
comment
для тестирования мой домашний шаблон просто ‹html›‹/html› - person ikcodez; 23.08.2016
comment
но даже если на домашней странице были ссылки на страницы с ограниченным доступом, зачем Spring вызывать контроллер входа в систему до того, как эти ссылки были нажаты? - person ikcodez; 23.08.2016
comment
если это были ссылки css/image/js, то это автоматически вызываемая вами html-страница. но поскольку они ограничены, это вызывает контроллер входа в систему. если у вас есть ссылки на другие страницы (без статической страницы), все должно быть в порядке - person storm_buster; 25.08.2016