`
cargoj
  • 浏览: 60120 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

redirect如何让url忽略model

阅读更多

本文翻译自http://stackoverflow.com/questions/2163517/how-do-i-prevent-spring-3-0-mvc-modelattribute-variables-from-appearing-in-url

 

三种方式:拦截器、viewresolver、redirect前model.asMap().clear()清除modelmap

 

1.拦截器中处理

 

     public class CommonModelMapInformationInterceptor implements
    HandlerInterceptor {

    // This method is unused as this Interceptor is for post handle only
    public void afterCompletion(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex)
    throws Exception { }

    // This method is unused as this Interceptor is for post handle only
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    return true;
    }

    public void postHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler,
    ModelAndView modelAndView) throws Exception {

    boolean isRedirectView = modelAndView.getView() instanceof RedirectView;
    boolean isViewObject = modelAndView.getView() == null;
    // if the view name is null then set a default value of true
    boolean viewNameStartsWithRedirect = (modelAndView.getViewName() == null ? true : modelAndView.getViewName().startsWith(UrlBasedViewResolver.REDIRECT_URL_PREFIX));

    if(modelAndView.hasView() && (
    ( isViewObject && !isRedirectView) ||
    (!isViewObject && !viewNameStartsWithRedirect))){
    addCommonModelData(modelAndView);
    }
    }

    public void addCommonModelData(ModelAndView modelAndView){
    modelAndView.addObject(“stuff”, “importantStuff”);
    modelAndView.addObject(“moreStuff”, “moreImportantStuff”);
    }
    }

 

 

2.viewresolver中处理

   我自己用的是继承自InternalResourceViewResolver,

   分别介绍两种方式:

   1)可以在需要忽略model的时候改用 redirectWithoutModel来做跳转

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;//此处原文返回空
        return super.resolveViewName(viewName, arg1);
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }
}

   2)当整个应用都不希望带model跳转,可以更简单的实现

  

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;
    }

}

 

-----------------------------------------------------------------------------------------------

3.1以后还可以设置ignoreDefaultModelOnRedirect属性为true

分享到:
评论

相关推荐

    Struts2文件上传下载和表单重复提交问题

    - **页面跳转(Redirect After Post)**:处理完请求后,使用`redirect`或`redirectAction`结果,将用户重定向到新的URL,避免回退按钮导致的重复提交。 4. **Struts2配置** 对于以上功能的实现,Struts2的配置...

    Java工程师面试题含答案.pdf

    `redirect()`方法(HttpServletResponse对象的成员方法)则使浏览器发起新的HTTP请求,地址栏会显示新URL,效率相对较低。 11. **XML解析**:DOM(Document Object Model)解析方式会加载整个XML文档到内存,方便...

    超级有影响力霸气的Java面试题大全文档

     forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。...

    java 面试题 总结

    forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。 redirect...

Global site tag (gtag.js) - Google Analytics