Привет, я работаю над загрузочным веб-приложением Spring, в котором использую безопасность Spring, а для представлений использую страницы JSP. при попытке получить доступ к страницам, настроенным с помощью Permitall(), то есть домашней страницей и страницей входа в систему, я получаю эту ошибку в браузере, и на консоли ничего не выводится. поэтому после добавления регистратора я узнал, что функция контроллера вызывается неоднократно. Ниже приведен мой код и снимок экрана консоли для справки. Не могли бы вы сообщить мне, что я здесь делаю не так?
Файл Application.properties для страниц JSP.
server.error.path=/error
spring.mvc.view.prefix: /WEB-INF/views/
spring.mvc.view.suffix: .jsp
Пейджконтроллер
@Controller
@RequestMapping(value = "/swadeshiBank/v1")
public class PageController {
public static final Logger logger = LogManager.getLogger(PageController.class);
private static final String loginPage = "login";
@GetMapping(value = "/")
public String homePage(){
logger.info("Request Came to home :");
return "home";
}
@GetMapping(value = "/login")
public String getLoginPage(){
logger.info("Request Came to login :");
return loginPage;
}
}
Конфигурация безопасности
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login").permitAll() // Public pages
.requestMatchers("/swadeshiBank/v1/account-details").authenticated() // Authenticated users
.requestMatchers("/swadeshiBank/v1/admin").hasRole("ADMIN") // Admin users
.requestMatchers("/swadeshiBank/v1/management").hasRole("MANAGER") // Manager users
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/swadeshiBank/v1/login")
.loginProcessingUrl("/swadeshiBank/v1/login") // URL to submit the login form
.defaultSuccessUrl("/swadeshiBank/v1/account-details", true)
.permitAll()
)
.logout(logout -> logout
.logoutRequestMatcher(new AntPathRequestMatcher("/swadeshiBank/v1/logout"))
.logoutSuccessUrl("/swadeshiBank/v1/login?logout")
.invalidateHttpSession(true)
.permitAll()
);
return http.build();
}
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("user")
.password("{noop}password")
.roles("USER")
.build());
manager.createUser(User.withUsername("admin")
.password("{noop}admin")
.roles("ADMIN")
.build());
manager.createUser(User.withUsername("manager")
.password("{noop}manager")
.roles("MANAGER")
.build());
return manager;
}
}
Структура проекта
Скриншот консоли
Скриншот браузера
Можете ли вы помочь мне здесь? кроме того, текущее поведение, которое я заметил, когда печатаю
http://localhost:8080/ в браузере я перехожу на http://localhost:8080/swadeshiBank/v1/login но я хочу, чтобы целевая страница была http://localhost:8080/swadeshiBank/ v1/ и страница входа должна появляться только тогда, когда я нажимаю кнопку входа в систему.




Когда вы установите для своего регистратора Spring-Security значение DEBUG, вы увидите, что Spring пытается получить доступ login.jsp как к защищенному ресурсу, то есть он блокирует файл с помощью своих функций безопасности.
Поскольку URL-адрес файла /WEB-INF/views/login.jsp не распознается ни одним из определенных вами средств сопоставления запросов, он разрешен только для аутентифицированных пользователей, поскольку это то, что вы установили для anyRequest() в своей http.authorizeHttpRequests() лямбда-функции. Это по-прежнему позволяет получить доступ к URL-адресу /login без аутентификации, но запрос к файлу login.jsp блокируется весной. Всякий раз, когда Spring блокирует запрос, он перенаправляет пользователя на страницу входа. Поскольку вы перенаправили URL-адрес /login на свою собственную конечную точку, это будет повторяться вечно, если бы не было жесткого ограничения на количество перенаправлений.
Чтобы решить вашу проблему, достаточно добавить конечную точку ресурса /WEB-INF/views/login.jsp к вашим средствам сопоставления запросов, у которых есть опция permitAll(), например:
// Class and stuff above
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/", "/swadeshiBank/v1/", "/swadeshiBank/v1/login", "/WEB-INF/views/login.jsp").permitAll() // Public pages
.requestMatchers("/swadeshiBank/v1/account-details").authenticated() // Authenticated users
.requestMatchers("/swadeshiBank/v1/admin").hasRole("ADMIN") // Admin users
.requestMatchers("/swadeshiBank/v1/management").hasRole("MANAGER") // Manager users
.anyRequest().authenticated()
)
// Your form-login-settings
// Your logout-settings
return http.build();
}
// Stuff below the method
По сути, вам нужно внести в «белый список» все конечные точки, которые вы хотите сделать доступными для общедоступных пользователей, что вы уже делаете. Но поскольку ваши конечные точки возвращают файлы .jsp, вам также необходимо внести их в «белый список». Для этого просто добавьте путь к файлу в папке ресурсов в файл requestMatchers. Это означает, что вам нужно добавить WEB-INF/views/login.jsp, как я показал в примере. Чтобы разрешить и другие конечные точки, вам также необходимо добавить их файлы .jsp. Вы также можете поместить все общедоступные файлы в папку и просто добавить всю папку, что упрощает задачу и делает ее менее запутанной.
Привет @Fi0x Спасибо за ответ. Можете ли вы помочь мне понять, как вы упомянули, что файл login.jsp блокируется, и Spring хочет, чтобы я сначала вошел в систему, поскольку я упомянул свой собственный URL-адрес для входа, поэтому он перенаправляется снова и снова, прежде чем получить доступ к каким-либо страницам JSP, будет ли это возможно, если я покажите home.jsp как целевую страницу, а затем нажмите кнопку «Войти». Этот вход отображается, поскольку я хочу, чтобы несколько страниц были доступны перед входом в систему. Благодарю за вашу помощь. Спасибо