Chr*_*ian 56 java spring spring-mvc
使用Spring MVC 3.0.0.RELEASE,我有以下Controller:
@Controller
@RequestMapping("/addIntake.htm")
public class AddIntakeController{
  private final Collection<String> users;
  public AddIntakeController(){
    users = new ArrayList<String>();
    users.add("user1");
    users.add("user2");
    // ...
    users.add("userN");
  }
  @ModelAttribute("users")
  public Collection<String> getUsers(){
    return this.users;
  }
  @RequestMapping(method=RequestMethod.GET)
  public String setupForm(ModelMap model){
    // Set up command object
    Intake intake = new Intake();
    intake.setIntakeDate(new Date());
    model.addAttribute("intake", intake);
    return "addIntake";
  }
  @RequestMapping(method=RequestMethod.POST)
  public String addIntake(@ModelAttribute("intake")Intake intake, BindingResult result){
    // Validate Intake command object and persist to database
    // ...
    String caseNumber = assignIntakeACaseNumber();
    return "redirect:intakeDetails.htm?caseNumber=" + caseNumber;
  }
}
Controller从填充HTML表单的命令对象中读取Intake信息,验证命令对象,将信息持久保存到数据库,并返回案例编号.
一切都很好,除了当我重定向到intakeDetails.htm页面时,我得到一个如下所示的URL:
http://localhost:8080/project/intakeDetails.htm?caseNumber=1&users=user1&users=user2&users=user3&users=user4...
如何防止用户集合显示在URL中?
小智 38
model.asMap().clear();
return "redirect:" + news.getUrl();
:)
ela*_*ich 30
从Spring 3.1开始,RequestMappingHandlerAdapter提供了一个标志ignoreDefaultModelOnRedirect,如果控制器重定向,您可以使用该标志来防止使用defautl模型的内容.
axt*_*avt 18
没有好的方法可以解决这个问题(即没有创建自定义组件,没有过多的显式xml配置且没有手动实例化RedirectView).
您可以RedirectView通过其4参数构造函数手动实例化,也可以在上下文中声明以下bean(在其他视图解析器附近):
public class RedirectViewResolver implements ViewResolver, Ordered {
    // Have a highest priority by default
    private int order = Integer.MIN_VALUE; 
    // Uses this prefix to avoid interference with the default behaviour
    public static final String REDIRECT_URL_PREFIX = "redirectWithoutModel:";     
    public View resolveViewName(String viewName, Locale arg1) throws Exception {
        if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
            String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
            return new RedirectView(redirectUrl, true, true, false);
        }
        return null;
    }
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
}
ska*_*man 18
该@ModelAttribute方法注释旨在被用于参照数据曝光到视图层.在你的情况下,我不能肯定地说,但我不会说一组用户符合参考数据.我建议您在@RequestMapping注释的处理程序方法中明确地将此信息传递给模型.
如果你还想使用@ModelAttribute,这里有一个博客条目讨论重定向问题.
但是所有前面的示例都有一个共同的问题,因为所有@ModelAttribute方法都在执行处理程序之前运行,如果处理程序返回重定向,则模型数据将作为查询字符串添加到url中.应该不惜一切代价避免这种情况,因为它可能会泄露一些关于如何整理应用程序的秘密.
他建议的解决方案(参见博客的第4部分)是使用a HandlerInterceptorAdapter来使视图可以看到公共参考数据.由于参考数据不应与控制器紧密耦合,因此在设计方面不应造成问题.
我知道这个问题和答案是陈旧的,但我在自己遇到类似问题之后偶然发现了它,并且我找不到其他很多信息.
我认为接受的答案不是很好.axtavt下方的答案要好得多.问题不在于控制器上的注释模型属性是否有意义.它是关于如何从通常使用ModelAttributes的控制器中发出"干净"重定向.控制器本身通常需要参考数据,但有时它需要在其他地方重定向以获得异常条件或其他任何东西,并且传递参考数据没有意义.我认为这是一种有效且常见的模式.
(Fwiw,我在Tomcat中意外地遇到了这个问题.重定向根本就没有用了,我得到了奇怪的错误消息,如:java.lang.ArrayIndexOutOfBoundsException:8192.我最终确定Tomcat的默认最大标头长度是8192.我没有' t意识到ModelAttributes被自动添加到重定向URL,这导致标头长度超过Tomcat的最大标头长度.)
我实现了Sid答案的变体,减少了复制和粘贴:
public class RedirectsNotExposingModelUrlBasedViewResolver extends UrlBasedViewResolver {
    @Override
    protected View createView(String viewName, Locale locale) throws Exception {
        View view = super.createView(viewName, locale);
        if (view instanceof RedirectView) {
            ((RedirectView) view).setExposeModelAttributes(false);
        }
        return view;
    }
}
这还需要定义视图解析器bean:
<bean id="viewResolver" class="com.example.RedirectsNotExposingModelUrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>
| 归档时间: | 
 | 
| 查看次数: | 48394 次 | 
| 最近记录: |