如何防止确认警报在F5上的Spring MVC中

时间:2013-07-18 06:01:51

标签: spring spring-mvc submit page-refresh

在Spring中,我通常会使用redirect-after-submit(get方法mapping)来阻止用户提交表单, 但是当我按下F5时,它将再次获取方法mapping并向我显示此类确认消息。我怎样才能在F5上每次都阻止此消息。

enter image description here

以下是控制器的代码 -

 ScheduleDetail objScheduleDetail = new ScheduleDetail();       
 HttpSession session = request.getSession(true);
 String condition = "";
 try{
      int careProfessionalIDF = (Integer) session.getAttribute("careProfessionalIDF");
      condition = "CareProfessionalIDF = "+careProfessionalIDF;
      objScheduleDetail.setCareProfessionalIDF(careProfessionalIDF);

    }catch (Exception e) {
      int careProviderIDF = (Integer) session.getAttribute("careProviderIDF");
      condition = "CareProviderIDF = "+careProviderIDF;
      objScheduleDetail.setCareProviderIDF(careProviderIDF);
    }

    List<ScheduleDetail> ScheduleDetailList = objScheduleDetailManager.getAllScheduleDetail(condition+" ORDER BY ScheduleDetailIDP DESC");
    model.addObject("List_of_ScheduleDetail",ScheduleDetailList);
    model.addAttribute("ScheduleDetail", objScheduleDetail);
    return "hospital/scheduleDetail";//jsp page

已修改的代码

 @RequestMapping("/editAddressType.html")
    public String editAddressType(ModelMap model,HttpServletRequest request)
    {
        int addressTypeIDP = Integer.parseInt(request.getParameter("AddressTypeIDP"));

        AddressType objAddressType = new AddressType();
        objAddressType = objAddressTypeManager.getByID(addressTypeIDP); 

        model.addAttribute("AddressType", objAddressType);

        return "jsp/addressType"; 

it open addressType.jsp with data tht we bind with `model.addAttribute`. now if i press F5 it show alert message as above image.

**get method**

    @RequestMapping(value="/getAddressType.html", method=RequestMethod.GET)
    public String getAddressType(ModelMap model, HttpServletRequest request) throws RemoteException
    {
        AddressType objAddressType = new AddressType();
        model.addAttribute("AddressType", objAddressType);

        return "hospital/addressType";
    }

1 个答案:

答案 0 :(得分:2)

如果您正确实施POST - REDIRECT - GET模式,您将看不到您提到的浏览器的警告。当正在查看的页面响应POST请求时,会显示警告。传统模式,FORM - POST - SUCCESS页面。

您在问题中提供的代码不足以解决问题的根本原因。我在这里列出了实施的关键点,请与您的代码进行比较,您就会明白错误是什么。

  1. 向用户显示表单,他们应该在哪里输入要提交的数据。 (只是起点,可以是您申请中的任何页面。)

    @RequestMapping(value = "/checkout/{cartId}.htm", method = RequestMethod.GET)
    public ModelAndView showCheckoutForm(...) {
         ......
         return new ModelAndView("/WEB-INF/jsp/form.jsp")
    }
    
  2. 表单POST发送给处理程序方法,该方法向用户发出重定向,指向一个URL,该URL将显示由于POST而创建的资源的详细信息。

    @RequestMapping(value = "/checkout/{cartId}.htm", method = RequestMethod.POST)
    public View submitCheckoutForm(....) {
         return new RedirectView("/checkout/confirmation/" + cartId + ".htm");
    }
    
  3. 创建的资源的详细信息将通过如下的处理程序方法显示。请注意,此时,如果您的实现正常工作,用户浏览器中的URL将更改为POST处理程序重定向的路径。并且将向服务器发出新的GET请求。

    @RequestMapping(value = "/checkout/confirmation/{cartId}.htm", method = RequestMethod.GET)
    public ModelAndView showCheckoutConfirmation(....) {
          return new ModelAndView("viewThatShowsCheckoutConfirmation");
    }
    
  4. 如果您的实现类似,则确认页面是GET请求的结果,因此如果您刷新页面,浏览器不会发出重新发布数据的警告。

    我怀疑你的POST处理程序没有向用户发出重定向,而是自己呈现确认页面。

    希望这会有所帮助。如果这不能解决您的问题,请告诉我。