【问题标题】:Loss of @SessionAttribute when redirecting in SpringMVC在 Spring MVC 中重定向时丢失@SessionAttribute
【发布时间】:2015-11-18 12:13:55
【问题描述】:

我面临一个特殊的问题。我正在学习 SpringMVC,这是我的第一个应用项目。

当我们在控制器中使用@SesssionAttributes 注解时,如果调用任何具有与@SessionAttribute 签名中的@ModelAttribute 参数同名的处理程序方法,则会话属性会自动更新。

现在我将控件重定向到另一个处理程序,该处理程序又呈现一个 jsp。我面临的问题是我能够在重定向的处理程序方法中访问@SessionAttribute,但是在它呈现的jsp中,会话属性丢失了。

这里是代码。

@Controller
@EnableWebMvc
@RequestMapping("/courtreservation/*")
@SessionAttributes("courtDetails")
public class ControllerServlet {



@RequestMapping(value="basePage",method=RequestMethod.GET)
public String basePageRenderer(Model model,HttpServletRequest request){
CourtDetails tempObj = (CourtDetails)request.getSession().getAttribute("courtDetails");        
 GenericXmlApplicationContext context = new GenericXmlApplicationContext();
    context.load("configs/applicationContext.xml");
    context.refresh();
    CourtDetails courtDetails = (CourtDetails)context.getBean("courtDetails");
    List<String> allSports = courtDetails.getAllSports();
    Calendar calendar = Calendar.getInstance();
    int numDay = calendar.get(Calendar.DAY_OF_WEEK);
    System.out.println(numDay);
    String[] days = {"sunday","monday","tuesday","wednesday","friday","saturday","sunday"};
    /*List<String> daysAvailableForReservation = new ArrayList<>();
    if(numDay == 1) {
        for(String day:days) {
            daysAvailableForReservation.add(day);
        }
    }
    else {
       for(int i=numDay--;i<days.length;i++) {
           daysAvailableForReservation.add(days[i]);
       }
    }*/
    model.addAttribute("daysAvailableForReservation", days);
    model.addAttribute("courtDetails", courtDetails);
    model.addAttribute("allSports",allSports);
    return "welcomePage";
}

@RequestMapping(value="checkAvailability",method=RequestMethod.POST)
public String checkAvailability(CourtDetails courtDetails,HttpServletRequest request,HttpServletResponse response,Model model) {
    HttpSession session = request.getSession();
    courtDetails = (CourtDetails)session.getAttribute("courtDetails");
    Boolean isAvailable = courtDetails.checkAvailability();
    if(isAvailable) {
        model.addAttribute("isAvailable","true");
        model.addAttribute("courtDetails",courtDetails);
        return "welcomePage";
    }
    model.addAttribute("isAvailable", "false");
    model.addAttribute("courtDetails",courtDetails);
    return "unavailable";
}






}

从 checkAvailability 重定向后,@SessionAttribute("courtDetails") 在 basePageRenderer() 中可用,但在它呈现的 jsp 中不可用,即welcomePage.jsp。

这里是视图分辨率配置。

1) 控制器 servlet 配置:

<bean class="org.springframework.web.servlet.view.XmlViewResolver" 
          p:location="/WEB-INF/classes/configs/appViews.xml" 
          p:order="0" />

2) appView.xml

<bean id="unavailable"
      class="org.springframework.web.servlet.view.RedirectView"
      p:url="/Sports_Reservation/courtreservation/basePage"  />

【问题讨论】:

    标签: java jsp spring-mvc servlets redirect


    【解决方案1】:

    here 似乎解释得很好。我有类似的问题,最终使用forward 而不是redirect

    【讨论】:

      【解决方案2】:

      将您的第二个处理程序更改为:

      @RequestMapping(value="checkAvailability",method=RequestMethod.POST)
      public String checkAvailability(
          @ModelAttribute("courtDetails") CourtDetails courtDetails,
          HttpServletRequest request,
          HttpServletResponse response,
          Model model
      )
      

      这将从会话中读取模型属性,然后从帖子中设置值。您无需手动从会话中读取值。

      【讨论】:

      • 感谢尼尔的回复。我对您提出的修复的理解是,一旦调用 checkAvailability() 方法,会话属性就会被更新,并且只有当模型中不存在模型属性时,该方法才会从会话中读取模型属性(请求范围) .由于我已经在请求中嵌入了模型属性,因此弹簧不会从会话中读取它。我是否遗漏了什么或者我的理解有缺陷?如果是这样,请纠正我。而且这仍然不能解决重定向时会话属性丢失的问题。
      • 如果重定向是问题,那么您应该将模型存储在 flashAttribute 中。见redirectAttributes参数
      • 嗨,尼尔,您在第二个处理程序方法中的修改有效,谢谢。但是我无法理解这个处理程序是如何从@SessionAttribute 中获取“courtDetails”属性的?我的理解是这样的。该方法是一个发布请求,因此已经存在的模型属性会丢失,因为它们在请求范围内。因此,当调用处理程序时,@SessionAttribute 会自动更新为随表单提交的值。由于没有模型/请求范围属性“courtDetails”,处理程序从会话中读取它。我说的对吗?
      • @Nish 当您的 GET 方法退出时,Spring 将“courtDetails”放入会话中(因为它是一个会话属性)。它在 POST 之前再次从会话中读取它(因为它是一个模型属性)。见stackoverflow.com/questions/8688135/…
      • 非常感谢我的朋友,现在事情有点清楚了。然而,会话对象的特殊性在重定向时继续存在。它们保留在会话范围内,并且可以在控制器处理程序方法中很好地访问,但在视图中以某种方式丢失(读取 jsp)。据我在网上查到的,这是春天的虫子,
      猜你喜欢
      • 2016-02-25
      • 2013-01-29
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多