Представляю проблему:
когда я запускаю приложение и ввожу URL "/ home". Домашняя страница отображается, но не правильно (шаблон плохо организован), и я получаю исключение TemplateInputException . Через некоторое время, если я обновляю домашнюю страницу и другие страницы, она возвращается в нормальное состояние, но если я захожу в «/ login» и я выхожу из системы, которая перенаправляет меня на домашний вид, та же проблема возвращается снова.
Консоль стека:
org.thymeleaf.exceptions.TemplateInputException: произошла ошибка
при разборе шаблона (template: "ресурс пути к классу
[templates / home.html] ") ...
Вызвано: org.attoparser.ParseException : ошибка во время выполнения процессора
'org.thymeleaf.spring4.processor.SpringActionTagProcessor' (шаблон:
«дом» - строка 2494, столбец 10) в
org.attoparser.MarkupParser.parseDocument (MarkupParser.java:393)
~ [Attoparser-2.0.4.RELEASE.jar: 2.0.4.RELEASE] ...
Причина: org.thymeleaf.exceptions.TemplateProcessingException : ошибка
во время исполнения процессора
'org.thymeleaf.spring4.processor.SpringActionTagProcessor' (шаблон:
«дом» - строка 2494, столбец 10)
Причина: java.lang.IllegalStateException: Невозможно создать сеанс после того, как ответ был зафиксирован в
org.apache.catalina.connector.Request.doGetSession (Request.java:2995)
~ [-Встраивать кот-ядро-8.5.14.jar: 8.5.14]
...
at org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository.saveToken (HttpSessionCsrfTokenRepository.java:63)
~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в
org.springframework.security.web.csrf.LazyCsrfTokenRepository $ SaveOnAccessCsrfToken.saveTokenIfNecessary (LazyCsrfTokenRepository.java:176)
~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в
org.springframework.security.web.csrf.LazyCsrfTokenRepository $ SaveOnAccessCsrfToken.getToken (LazyCsrfTokenRepository.java:128)
~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] в
org.springframework.security.web.servlet.support.csrf.CsrfRequestDataValueProcessor. getExtraHiddenFields (CsrfRequestDataValueProcessor.java:71)
~ [spring-security-web-4.2.0.RELEASE.jar: 4.2.0.RELEASE] ...
Код источника:
Проблема в контактной форме home.html в этой строке: th:action="@{/home/contact}" th:object="${mailForm}"
:
<form id="contact-form" method="post" action="/home/contact}"
th:action="@{/home/contact}" th:object="${mailForm}"
role="form">
<!-- <input type="hidden" name="${_csrf.parameterName}"
value="${_csrf.token}" /> -->
<input type="text" name="senderName" th:field="*{senderName}">
<input type="text" name="senderLastName" th:field="*{senderLastName}">
<input type="email" name="senderEmail" th:field="*{senderEmail}">
<textarea name="message" th:field="*{message}"></textarea>
<button type="submit">Send Message</button>
</form>
Я думаю, что это проблема с токеном csrf. Я попытался добавить эту строку <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
в мою форму, и защита csrf включена по умолчанию в Spring Security, но она не сработала.
Контроллер, который вызывает службу для отправки почты:
@Controller
public class HomeController {
@Autowired
private EmailService emailService;
@Autowired
private MailValidator mailValidator;
// some other code like @InitBinder methode ...
// method to post mailForm
@PostMapping("/home/contact")
public String contactUsHome(@Valid @ModelAttribute("mailForm") final MailForm mailForm, BindingResult bindingResult)
throws MessagingException {
if (bindingResult.hasErrors()) {
return HOME_VIEW;
} else {
mailForm.setRecipientEmail(recipientEmail);
Mail mail = DTOUtil.map(mailForm, Mail.class);
emailService.sendSimpleMail(mail);
return REDIRECT_HOME_VIEW;
}
}
}