【发布时间】:2015-01-29 21:22:32
【问题描述】:
我正在使用 JAVA Spring mvc 开发一个网站。我有一个需要两个控制器的功能。首先,请求由控制器 1 处理,控制器使用返回的新 ModelAndView(“redirect:controller2.htm”)将请求重定向到控制器 2。一切正常。但是,我想阻止对控制器 2 的直接访问(阻止来自 url“controller2.htm”的调用),因为控制器 2 的表单需要来自控制器 1 的数据。我希望使用控制器 2 的唯一情况是重定向来自控制器 1。我想要一个没有注释的解决方案。在此先感谢您的帮助。 这是代码: 控制器1:
public class controller1 extends SimpleFormController implements Serializable {
private PersonManager pManager ;
@Override
public ModelAndView onSubmit(Object command) {
CommandPerson cmd = (CommandPerson) command;
Person p = null;
String viewName = "redirect:controller2.htm";
try {
p = pManager.getPersonbyID(cmd.getID());
} catch (EmptyResultDataAccessException ex) {
viewName="NosuchPerson";
}
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("ID",cmd.getID());
return mav;
}
控制器2:
public class controller2 extends SimpleFormController implements Serializable {
private PersonManager pManager ;
@Override
public ModelAndView onSubmit (Object command) throws ServletException, IOException {
Person p = (Person) command;
Map<String,Object> model = new HashMap<String,Object>();
pManager.UpdatePerson(p);
model.put("person", p);
return new ModelAndView("SuccesfulUpdate","model",model);
}
protected Object formBackingObject(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter("ID");
if(id==null) {
response.sendRedirect("controller1.htm");
return null;
} else{
Personne p = pManager.getPersonbyID(id);
return p;
}}
如果直接调用 url “controller2.htm”,则 ID 参数将为 null,并且由于 formBackingObject() 是处理请求时执行的第一个方法,我想我可以在其中进行重定向,但它没有工作,因为我被重定向到 controller2 的表单为空。
【问题讨论】:
-
重定向会导致 浏览器 发出对重定向 URL 的请求。您希望如何实现这种差异化?
-
解决这个问题的方法太多了。也许最简单的方法是在网络级别限制访问。
-
该功能是一种更新功能。第一个表单是用户在表单的字段中填写一个 id ,然后第一个控制器检查具有指定 ID 的对象是否存在于数据库中。如果存在,则重定向到第二个控制器,该控制器使用 ID 从数据库中提取对象,然后使用 formBackingmethod() 用对象的当前值填充第二个表单。我只是想阻止对控制器 2 的直接访问,因为如果用户直接从浏览器调用 url “controller2.htm”,他将不会得到预先填写的表单。
-
你能显示重定向代码吗?
标签: java spring-mvc