【问题标题】:@SessionAttributes how to clear properly a session attribute@SessionAttributes 如何正确清除会话属性
【发布时间】:2014-02-10 14:10:48
【问题描述】:

我想在确认页面上创建一个带有特殊操作的普通表单向导。

  1. 获取表单数据(表单预填充了会话属性)
  2. 按 OK,通过发布 JSON 保存表单数据并更新 会话属性
  3. 在摘要页面上显示更新会话属性的表单
  4. 按 OK,将表单数据保存到我的存储中。按“正确”后,我返回第 1 步(表单已预先填写更新的会话属性)。
  5. 显示确认页面(带有成功消息)并显示 “打印”按钮(这是另一个页面)并通过调用 SessionStatus#setComplete() 删除会话属性

我的问题是当用户想要在确认页面上打印时(他转到打印页面),但我的会话属性已在第 5 步被破坏。我丢失了我的模型数据。 如果我删除 SessionStatus#setComplete(),当用户返回第 1 步时,会预先填充以前的数据而不是新数据。

那么,我该怎么做呢?

 @SessionAttributes({"addressForm", "userContactDetails", "newAddressInformation"})
    public class AddressProfileController {
    //....

    @ModelAttribute("addressForm")
    public AddressForm getAddressForm() {
            // Form is pre-filled
        return webModelMapper.processMapping(new AddressForm(), getUserContactDetails().getAddressInformation());
    }

    @ModelAttribute("newAddressInformation")
    public AddressInformation getNewAddressInformation() {
        return new AddressInformation();
    }

    @ModelAttribute("userContactDetails")
    public ContactDetails getUserContactDetails() {
        return profilService.getUserContactDetails();
    }
    //....

在第 2 步中,我正在使用新的 addressForm 值更新 newAddressInformation 因此,如果我回到第 1 步,新值会预先填写在表单上。

第五步,删除确认页面的会话属性:

@RequestMapping(value = "/dcr/dcr-confirmation-adresse.html")
    public String confirmUserAddressForm(@ModelAttribute("newAddressInformation") AddressInformation newAddressInformation, @ModelAttribute("userContactDetails") ContactDetails contactDetails, Model model, SessionStatus sessionStatus) {
        // do something
        sessionStatus.setComplete(); // invalidate session attributes

在第5步之后,会话属性不可用(与以前的数据):

@RequestMapping(value = "/print-address.html")
    public String printUserAddressForm(@ModelAttribute("newAddressInformation") AddressInformation newAddressInformation, @ModelAttribute("userContactDetails") ContactDetails contactDetails, Model model) {   
            // newAddressInformation is empty bean, because session attributes has been previously detroyed

【问题讨论】:

    标签: forms session spring-mvc controller


    【解决方案1】:

    更新

    @RequestMapping(value = "/dcr/dcr-confirmation-adresse.html")
        public String confirmUserAddressForm(@ModelAttribute("newAddressInformation") AddressInformation newAddressInformation, @ModelAttribute("userContactDetails") ContactDetails contactDetails, Model model, SessionStatus sessionStatus, HttpServletRequest request) {
          HttpSession session = request.getSession();
            session.setAttribute("addressForm", addressForm);
    

    所以你用你更新的对象设置会话属性!

    【讨论】:

    • 如果我删除 sessionStatus.setComplete,我的第 1 步出现问题(新值已预先填写在表单上)
    • 1) 您有 addressForm 对象:- Street = A, City = B 您可以更改值 - Street = C 2) 当您按 OK 时,您会在控制器中获得一个 newAddressInformation 对象,其值为 Street = C, City = B。现在您将 addressForm 对象从 Streez = A 更新为 Street = C 并显示摘要页面! 3)当您在摘要页面上按 OK 时,您想保留新数据,当您按 Correct 时,您将返回值 Street = C,City = B 的第一个页面!它是否正确?你能告诉我你在哪个页面上使用哪个对象吗?您可以发布我之前回答的更改吗?
    • 因为地址可以通过其他方式更新(例如移动应用程序)。如果用户开始更改地址并在 webapp 中确认。在他在移动设备上更正他的地址后。他想在 webapp 上进行一些调整。 Webapp 不能包含设备上的新数据集,因为 webapp 在会话中使用数据......是否可以只删除一些会话属性(在我的情况下为“addressForm”),而不是全部?
    • 在 setComplete 或移除特定的会话属性后没有办法重用会话属性吗? (而不是使用 HttpSession)
    • 也许它存在,我不知道另一种方式.. 但是你用 HttpSession 试过了吗?有效吗?
    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2015-03-03
    • 2013-08-15
    • 2015-03-01
    相关资源
    最近更新 更多