【问题标题】:spring mvc prevent direct access a methodspring mvc 防止直接访问方法
【发布时间】:2012-11-02 13:36:38
【问题描述】:

我刚开始学习 spring mvc 3。我发现了一个小问题,我的控制器将处理一个发布请求(注册表单)。但是如果在地址栏中输入映射值(bla3/save.html),它将执行它不应该执行的方法。这就是为什么我需要一个解决方案,如果有人直接输入地址,它应该重定向到其他页面而不是尝试添加新用户。

@RequestMapping(value = "/save", method = RequestMethod.POST) //save new user
public ModelAndView saveUser(@ModelAttribute("user") User user, BindingResult result){
    userService.addUser(user);  
    return new ModelAndView("redirect:/users.html");
}

【问题讨论】:

    标签: java spring spring-mvc data-access


    【解决方案1】:

    如果您在地址栏中直接有 URL,那将是一个 GET 请求,您可以针对该请求处理不同的行为,例如此 URL 禁止 GET 或为用户呈现空白表单,提交时将调用 POST 方法。

    @RequestMapping(value = "/save", method = RequestMethod.GET)
    public ModelAndView saveUser(@ModelAttribute("user") User user, BindingResult result){
        userService.addUser(user);  
    
    }
    

    【讨论】:

    • 好的,所以基本上我所要做的就是创建另一种方法来处理 GET 请求。我明天试试,因为项目在我的办公室电脑里。
    • 是的 .. 只是有一个控制器方法来处理 HTTP GET 请求
    【解决方案2】:

    在你的控制器类中添加这个方法。

    @RequestMapping(value = "bla3/save", method = RequestMethod.GET)
    public ModelAndView saveUser(@ModelAttribute("user") User user, BindingResult result){
        userService.addUser(user);  
    ...
    return new ModelAndView("redirect:/users.html");
    }
    

    如果在地址栏中键入映射​​值 (bla3/save.html)。该方法将执行。

    【讨论】:

      【解决方案3】:

      您可以让该方法仅在有特定标头(如以下代码)时才执行。

       @RequestMapping(value = "/save", method = RequestMethod.POST, headers="X-Requested-With=XMLHttpRequest")
      

      这种情况下,该方法只有在jquery ajax请求时才会执行(jQuery自动添加header)

      当然,这只是一种 Poka-yoke

      【讨论】:

        猜你喜欢
        • 2014-06-21
        • 1970-01-01
        • 2012-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多