仅将 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的主要内容,如果未能解决你的问题,请参考以下文章