仅将 Spring 页面视图限制为 POST

Posted

技术标签:

【中文标题】仅将 Spring 页面视图限制为 POST【英文标题】:Restrict Spring page view into POST only 【发布时间】:2013-12-27 04:13:30 【问题描述】:

我的 Spring 控制器如下所示:

@Controller
@RequestMapping(value = "calc")
public class CalcController 

  protected final Log logger = LogFactory.getLog(getClass());

  @Autowired
  private MyService myService;

  @RequestMapping(method = RequestMethod.GET)
  public String showCalcPage(
      @ModelAttribute("myModel") MyModel myModel,
      Model model, HttpServletRequest request) 

      // assemble page

    return "calc";
  

  @RequestMapping(method = RequestMethod.POST)
  public String showResultsPage(
      @ModelAttribute("myModel") MyModel myModel,
      BindingResult result, Model model,
      final RedirectAttributes redirectAttributes,
      HttpServletRequest request) 

    myService.evaluate(myModel);

    redirectAttributes.addFlashAttribute("myModel", myModel);
    model.addAttribute("myModel", myModel);

    return "redirect:calc/results";
  

  @RequestMapping(value = "/results")
  public String showResultsPage(ModelMap model,
      @ModelAttribute("myModel") final MyModel myModel,
      final BindingResult bindingResult) 

    // assemble page

    return "results";
  

我有一个包含 GET 和 POST 的 URL calc 的映射以及另一个用于 calc/results 的映射。

这对我来说非常有效,但每当我尝试直接访问 calc/results 时,页面仍然呈现。

因此我对其RequestMethod 进行了POST 限制,例如:

  @RequestMapping(value = "/results", method = RequestMethod.POST)
  public String showResultsPage(ModelMap model,
      @ModelAttribute("myModel") final MyModel myModel,
      final BindingResult bindingResult) 

    // assemble page

    return "results";
  

这通过抛出 405 消除了对映射的直接查看,但是当我从 calc 提交表单时,错误仍然存​​在。

我该如何合并这两种情况?

我实际上只想要两个像下面这样的控制器来实现 POST 和页面限制,但它在我的部分不起作用(我将它诊断为 jsp 的不同映射)。

@Controller
@RequestMapping(value = "calc")
public class CalcController 

  protected final Log logger = LogFactory.getLog(getClass());

  @Autowired
  private MyService myService;

  @RequestMapping(method = RequestMethod.GET)
  public String showCalcPage(
      @ModelAttribute("myModel") MyModel myModel,
      Model model, HttpServletRequest request) 

      // assemble page

    return "calc";
  

  @RequestMapping(value = "/results", method = RequestMethod.POST)
  public String showResultsPage(
      @ModelAttribute("myModel") MyModel myModel,
      BindingResult result, Model model,
      final RedirectAttributes redirectAttributes,
      HttpServletRequest request) 

    // assemble page    

    myService.evaluate(myModel);
    model.addAttribute("myModel", myModel);

    return "redirect:results";
  

【问题讨论】:

在您的表单中,您应该将方法提及为POST @TejaKantamneni,是的,我的 jsp 表单中有一个 method="POST" 属性加上一个 action="calc" 以映射到我的控制器。 action 应该是calc/results,对吗?如果是,它应该可以工作,尝试使用 firbug 查看 http 交换,看看是什么问题 它现在抛出一个HTTP 500 这可能是一个不同的问题。可能的应用程序异常。 【参考方案1】:

我终于实现了POST 限制和calc/results 页面的成功查看(但没有redirect,因为根据我的Tomcat 服务器它会导致“重定向循环”)。

这是最终的控制器:

@Controller
public class CalcController 

  protected final Log logger = LogFactory.getLog(getClass());

  @Autowired
  private MyService myService;

  @RequestMapping(value = "calc", method = RequestMethod.GET)
  public String showCalcPage(
      @ModelAttribute("myModel") MyModel myModel,
      Model model, HttpServletRequest request) 

    // assemble page

    return "calc";
  

  @RequestMapping(value = "calc/results")
  public String showResultsPage(
      @ModelAttribute("myModel") MyModel myModel,
      ModelMap model, final BindingResult bindingResult,
      HttpServletRequest request) 

    // assemble page

    // apply BindingResult validation in da fyoochoor
    myService.evaluate(myModel);
    model.addAttribute("myModel", myModel);

    return "results";
  

现在直接访问calc/results 会抛出HTTP 500,这将确保它的安全。只需确保在您的 web.xml 中声明此异常的页面,以便在部署时保持美观。

【讨论】:

直接访问calc/results 应该抛出一个405 方法 not allowed not 500 谢谢。把它留在500 而不是405 有错吗?不过我会继续修复它。

以上是关于仅将 Spring 页面视图限制为 POST的主要内容,如果未能解决你的问题,请参考以下文章

Echo Nest API:仅将曲目限制为一个桶

仅将 API URL 限制为 Android 应用程序

仅将 S3 对象 URL 限制为网站上的登录用户

仅将inputText值限制为字母字符

尝试仅将某些实体加载到表视图中

Swift 仅将协议限制在某些类型的类中