Я делаю пример со страницей входа - Spring Security.
Коротко:
- Есть корневая страница ("localhost: 8080 /") - вот ссылка на главную страницу.
- Нажмите на ссылку на главной странице и перейдите на main.html (localhost: 8080 / main /
- Если пользователь не авторизуется, он перенаправляется на страницу входа
- При авторизации пользователя открывается главная страница
- На главной странице отображаются сообщения и фильтр по тегу
- Я ввожу тег в поле ввода и нажимаю кнопку Поиск (Найти), сообщения фильтруются по тегу
Когда я добавил авторизацию, фильтр прекратил работу.
Это мой исходный код:
корневая страница - есть ссылка на главную страницу
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Gretting start: Serving Web Content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>Hello, user</div>
<a th:href="@{/main}">Main page</a>
</body>
</html>
Главная страница
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>
<form method="post">
<input type="text" name="text" placeholder="Введите сообщение" />
<input type="text" name="tag" placeholder="Тэг">
<button type="submit">Добавить</button>
</form>
</div>
<div>Список сообщений</div>
<form method="post" action="filter">
<input type="text" name="filter">
<button type="submit">Найти</button>
</form>
<div th:each = "message : ${messages}">
<b th:text = "${message.id}"></b>
<span th:text = "${message.text}"></span>
<i th:text = "${message.tag}"></i>
</div>
</body>
</html>
Контроллер обрабатывает все сопоставления
package com.example.sweater;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.example.sweater.domain.Message;
import com.example.sweater.repos.MessageRepo;
@Controller
public class GreetingController {
@Autowired
private MessageRepo messageRepo;
@GetMapping("/")
public String greeting(Model model) {
return "greeting";
}
@GetMapping("/main")
public String main(Model model) {
Iterable<Message> messages = messageRepo.findAll();
model.addAttribute("messages", messages);
return "main";
}
@PostMapping("/main")
public String add(@RequestParam String text, @RequestParam String tag, Model model) {
Message message = new Message(text, tag);
messageRepo.save(message);
Iterable<Message> messages = messageRepo.findAll();
model.addAttribute("messages", messages);
return "main";
}
@PostMapping("/filter")
public String filter(@RequestParam String filter, Model model) {
Iterable<Message> messages;
if (filter != null && !filter.isEmpty()) {
messages = messageRepo.findByTag(filter);
} else {
messages = messageRepo.findAll();
}
model.addAttribute("messages", messages);
return "main";
}
}
WebSecurityConfig имеет одного пользователя в памяти. antMathcers ("/") allowAll и anyRequest аутентифицированы
package com.example.sweater.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@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();
}
@Bean
@Override
public UserDetailsService userDetailsService() {
UserDetails user =
User.withDefaultPasswordEncoder()
.username("u")
.password("p")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
Мои скриншоты
корневая страница
Главная страница
Когда я ввожу тег фильтра и нажимаю кнопку «Найти» (= Поиск), у меня появляется ошибка:
@PostMapping("/filter")
не улавливает действие в форме. Я проверил в отладчике. Я не могу поймать ошибку и не знаю, почему это происходит.
У меня есть репозиторий GitHub: https://github.com/aalopatin/sweater
Подтвердить с комментарием "Добавить сообщения" - работа фильтра
Фиксировать с комментарием «Добавить удаленный репозиторий и Логин» - фильтр не работает и добавить логин