Как управлять атрибутами сеанса из-за почтовых запросов и истории

У меня есть следующая проблема:

Я хочу отправить информацию между модулями (различными контроллерами), используя 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, вы не будете испытывать ваше "ужасное предупреждение об истечении срока действия".
См. Перенаправление после публикации

Другие вопросы по тегам