Как управлять атрибутами сеанса из-за почтовых запросов и истории
У меня есть следующая проблема:
Я хочу отправить информацию между модулями (различными контроллерами), используя POST по соображениям безопасности. Моя логика была примерно такой:
Поиск пользователей> Клики по конкретному элементу> Отправка формы с запросом публикации в контроллер> Контроллер показывает представление определенного элемента> Клики пользователя на странице подэлемента> Отправка формы с запросом публикации в контроллер подэлемента
Однако из-за того, как работает POST, при переходе со страницы Subitem на страницу Item он выдает мне сообщения "Срок действия веб-страницы истек".
Мое решение этой проблемы состоит в том, чтобы сохранить эти параметры в Java HttpSession
Спасибо за этот пост. Однако я не совсем уверен, как это сделать.
Например, вот некоторые фрагменты моего кода (для записи я использую тимилиф в качестве резольвера представления):
Search.html сниппет
<tr th:each="customer:${results.pageList}">
<td>
<form method="POST" id="goToUser" name="goToUser" action="/customer/">
<input type="hidden" name="acctCustNbr" th:value="${customer.acctCustNbr}"/>
<a href="javascript:;" onclick="javascript:document.getElementById('goToUser').submit();"
th:text="${customer.acctCustNbr}">000010</a>
</form>
</td>
<!-And so on-->
Контроллер Customer (или Item, в примере), который получает этот запрос:
@RequestMapping(value = "/customer/", method = RequestMethod.POST)
public String getCustomer(@RequestParam(value = "acctCustNbr", required = false) String acctCustNbr,
Model model,
HttpSession session) {
boolean error = false;
String errorMsg;
logger.info("acctCustNbr obtained is >" + acctCustNbr + "<");
if(acctCustNbr==null){
acctCustNbr = (String) session.getAttribute("acctCustNbr");
}
else
session.setAttribute("acctCustNbr", acctCustNbr);
/*Service methods and model additions*/
Теперь, как мне пройти этот начальный этап? Кажется, что контроллер моего подэлемента может получить атрибут сеанса в порядке, но ответная реакция на браузер все еще открывает это страшное предупреждение об истечении срока действия.
Моя логика, если пользователь нажимает кнопку "Назад" /customer/
страницу, которую он отправит acctCustNbr==null
, Очевидно, я не прав, потому что это не работает.
Итак, мой вопрос, что я здесь делаю не так?
РЕШЕНИЕ благодаря @skirsch
Я переименовал мой метод контроллера в это:
@RequestMapping(value = "/customer/", method = RequestMethod.GET)
public String getCustomer(Model model, HttpSession session) {
boolean error = false;
String errorMsg;
/** service invocations and stuff**/
И добавил это:
@RequestMapping(value = "/customer1/", method = RequestMethod.POST)
public String storeAcctCustNbrInSession(@RequestParam(value = "acctCustNbr", required = false) String acctCustNbr,
Model model, HttpSession session) {
session.setAttribute("acctCustNbr", acctCustNbr);
return "redirect:/customer/";
}
1 ответ
Вам необходимо перенаправить браузер в другое место после сохранения данных в сеансе. Это другое место может быть
@RequestMapping(value = "/customer/", method = RequestMethod.GET)
public String getCustomerFromSessionValue(Model model, HttpSession session) { ... }
Когда вы перенаправляете, используя метод GET, вы не будете испытывать ваше "ужасное предупреждение об истечении срока действия".
См. Перенаправление после публикации