2

在 Spring 中,我通常会执行一个 redirect-after-submit(get method mapping) 来防止用户提交表单,但是当我按下F5它时会再次进入 get 方法mapping并向我显示这种确认消息。我怎么能每次都阻止这个消息F5

在此处输入图像描述

这是控制器的代码 -

 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";
    }
4

1 回答 1

3

如果您正确实施 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");
    }
    

如果您的实现类似,则确认页面是 GET 请求的结果,因此如果您刷新页面,浏览器不会发出重新发布数据的警告。

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

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

于 2013-08-01T13:30:28.263 回答