List<Person> data
передаёте на представление через model.addAttribute("Person", data);
и выводите с помощью Thymeleaf итератора. Например так:<div th:each="user : ${Person}">
<span th:text="${user.name}"></span>
<span th:text="${user.date}"></span>
<span th:text="${user.role}"></span>
<span th:text="${user.description}"></span>
</div>
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(servletContext);
templateResolver.setPrefix("/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setCacheable(false); // отключаем везде кэш на время разработки
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolver(){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
viewResolver.setCharacterEncoding("UTF-8");
return viewResolver;
}
jakarta.servlet
и thymeleaf-spring6
в poom.xml<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
src/main/webapp/hello.html
templateResolver.setPrefix("/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
@Controller
@RequestMapping("/")
public class FirstController {
@GetMapping("/hello")
public String helloPage() {
return "hello";
}
}
localhost:8080/hello
где 8080 - это номер порта на котором работает ваш сервер.изучая чужие проекты написанные на java spring boot
@PostMapping("/process_register")
public String processRegister(User user) {
BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
user.setRole("USER");
userRepo.save(user);
return "register_success";
}
@Bean
public PasswordEncoder pass(){
return new BCryptPasswordEncoder();
}
SseEventBuilder event1 = SseEmitter....
emitter.send(event1);
SseEventBuilder event2 = SseEmitter....
emitter.send(event2);
static interface
extends ResponseBodyEmitter и можно было догадаться. https://www.baeldung.com/spring-server-sent-events насколько хорошо spring security защищает
Как мне теперь обратиться к этому объекту в параметре метода контролера?
@InitBinder
но я также не увидел, чтоб вы где-то создали объект "Product". Если WebDataBinder считается объектом, то вы его преобразовали в строку String str = binder.getTarget().toString()+
Далее вы создали MutablePropertyValues, что эквивалентно Map <String, String>
или <String, Object>
Короче говоря: вы нигде не создали объект Product чтоб к нему обращаться. const currentUrl = document.referrer;
$.get('ajax/index', {ref:currentUrl});
private @ResponseBody void checkReferrer(Principal principal,
HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String currentUrl = req.getParameter("ref");
currentUrl = currentUrl.substring(currentUrl.indexOf("/")+2);
String localName = req.getServerName();
if (principal!=null && !currentUrl.startsWith(localName)) {
req.getSession().invalidate();
req.logout();
Cookie [] cookies = req.getCookies();
if(cookies!=null) {
for(Cookie c : cookies) {
c.setValue("");
c.setPath("/");
c.setMaxAge(0);
resp.addCookie(c);
}
}
}
}
http.csrf()
.disable().and()
....
frameOptions().sameOrigin();
Как сделать INSERT в две таблицы в одном запросе?
jdbcTemplate.batchUpdate(new String [] {
"DELETE FROM statusChat WHERE id IN("+id1+", "+id2+") LIMIT 2",
"DELETE FROM invites WHERE id="+id1+" AND idInviter="+id2
});
ArrayList <Long> listID;
String SQL = "DELETE FROM statusChat WHERE id IN(?";
for(int i=0; i<(listID.size()-1; i++)
SQL = SQL+",?"; SQL=SQL+")";
jdbcTemplate.batchUpdate(SQL, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
i=1;
for (int x=0; x<listID.size(); x++, i++) {
long id = listID.get(x);
ps.setLong(i, id));
}
}
Как вернуть страницу с id в Spring?
В пост-методе контроллера "/routes/edit-all-sequence/{id}/" выделяет, как не соответствующую страницу MVC.
model.addFlashAttribute("sequenceGapError", true);
и будет автоматически распространяться на «выходной» FlashMap текущего запроса. return "/routes/edit-all-sequence/";
По идее должна вернуться страница с параметрами {id} текущего запроса и, никакой redirect вам не нужен. @GetMapping("users/**")
public String show(@RequestParam(value="id", required=false) String id){
if (id==null)
return "/";
........
return "users";
}
@RequestParam
не нужны.@GetMapping("/publisher/**")
public String publisher(HttpServletRequest req, Principal principal, Model model){
String id = req.getRequestURL().toString();
id = id.substring(id.indexOf("/publisher")+10); // "/publisher" == 10
if (id.startsWith("/"))
id=id.substring(1);
if (principal==null && id.isBlank()) {
return "redirect:/";
}
else {
id = urlModelByOwner(principal, model, id);
}
if(!id.isBlank())
return "redirect:publisher"+id;
return "publisher";
}
<script th:inline="javascript">
var htmlVariable = /*[#th:block th:utext="${htmlText}"/]*/;
</script>
Html текст нужно предварительно взять в 'одинарные' кавычки. Иначе JavaScript не будет работать.var htmlVariable = /*[[${htmlText}]]*/ 'value';
при этом 'value' будет заменено ${htmlText} содержанием. Однако, могут быть проблемы с UTF-8.<script th:inline="javascript">
var htmlVariable = '[(${htmlText})]';
</script>
Как установить в ответ http-код 412 и одновременно отменить выполнение запросов типа POST, PUT, DELETE?
@GetMapping
Второй с аннотацией @RequestMapping("/")
или @PostMapping
для выше упомянутых случаев, и добавить в его параметры HttpServletResponse resp
В теле метода: resp.setStatus(412); return "redirect:error_page.html";
Можно сделать метод void или делать переадресацию.@PostMapping
templateEngine.addDialect(new SpringSecurityDialect());
Класс конфигурации:@Configuration
public class WebSecurityConfig implements WebMvcConfigurer {
........
@Bean
public SpringResourceTemplateResolver templateResolver(){
SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
templateResolver.setApplicationContext(servletContext);
templateResolver.setPrefix("/");
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
templateResolver.setCacheable(false);
return templateResolver;
}
@Bean
public SpringTemplateEngine templateEngine(){
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver());
templateEngine.setEnableSpringELCompiler(true);
templateEngine.addDialect(new SpringSecurityDialect());
return templateEngine;
}
@Bean
public ThymeleafViewResolver viewResolver(){
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setTemplateEngine(templateEngine());
return viewResolver;
}
}
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
@Configuration
@EnableWebSocketSecurity
public class WebSocketSecurityConfig {
@Bean
AuthorizationManager<Message<?>> messageAuthorizationManager(MessageMatcherDelegatingAuthorizationManager.Builder messages) {
return AuthorityAuthorizationManager.hasRole("USER");
}
}
@Component
public class CustomAuthencationProvider implements AuthenticationProvider {
@Autowired
private CustomPersonRepository DAO;
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String userName = authentication.getName();
String password = authentication.getCredentials().toString();
Person myUser = DAO.findByUsername(userName);
if (myUser == null) {
throw new BadCredentialsException("Unknown user "+userName);
}
if (!password.equals(myUser.getPassword())) {
throw new BadCredentialsException("Bad password");
}
UserDetails principal = User.builder()
.username(myUser.getLogin())
.password(myUser.getPassword())
.roles(myUser.getLogin())
.build();
return new UsernamePasswordAuthenticationToken(
principal, password, principal.getAuthorities());
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
SecurityConfig implements WebMvcConfigurer
указать соответствующий бин:@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>