【问题标题】:Spring MVC - keep request parameters after redirectSpring MVC - 重定向后保留请求参数
【发布时间】:2012-03-13 14:38:08
【问题描述】:

我的前端开发人员想为每个链接添加几个参数。他需要这些作为链接指向的视图中的参数。

每个@Controller 方法将只返回字符串。这是由使用所述字符串作为视图名称的标准视图解析器支持的:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />

然而,当控制器返回redirect: 时,原始请求中的请求参数将被删除,他无法在.jsp 中访问它们

是否有任何巧妙的方法可以确保即使在redirect:'ing 之后,url 参数也会出现在重定向到的视图中?

【问题讨论】:

    标签: java spring redirect spring-mvc request


    【解决方案1】:

    您需要一个闪光灯瞄准镜。它已经从 spring 3.1.RC1 开始实施 - see the request

    【讨论】:

    • 所以我基本上必须用RedirectAttributesModelMap 替换@Controller 方法中的ModelMap,它应该可以工作吗?
    • 我不完全确定它是如何工作的——也许 Rossen Stoyanchev 的最后一条评论应该能有所启发。请让我知道它是否有效。
    • 乍一看,它是行不通的。 RedirectAttributesModelMap 不能用作 ModelMap 的替代品,因为每个值都将存储为字符串表示形式。而且我的大多数方法都需要存储和处理对象,通过 ModelMap 传递。
    • 我目前正在研究拦截器。拦截每个请求,提取请求参数并放入模型中。但是,我的前端人员在 .jsp 中以 ${param.nameOfTheUrlParam} 的形式访问它们,这是标准的。不确定这是否仍然有效。
    【解决方案2】:

    由于 Bozho 建议的解决方案不能满足我的需求,因此我编写了一个过滤器,它完全符合我的要求。不确定在未来的情况下是否会出现任何问题,但在那之前,请随意使用我的实现:

    @Service
    public class RedirectFilter implements Filter {
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
        String queryString = ((HttpServletRequest) request).getQueryString();
        if (queryString != null) {
            RedirectAwareResponseWrapper res = new RedirectAwareResponseWrapper((HttpServletResponse) response);
            chain.doFilter(request, res);
            if (res.isRedirected()) {
                ((HttpServletResponse) response).sendRedirect(res.getLocation() + "?" + queryString);
            }
        } else {
            chain.doFilter(request, response);
        }
    }
    
    @Override
    public void destroy() {
    }
    
    class RedirectAwareResponseWrapper extends HttpServletResponseWrapper {
    
        private boolean redirected = false;
        private String location;
    
        public RedirectAwareResponseWrapper(HttpServletResponse response) {
            super(response);
        }
    
        @Override
        public void sendRedirect(String location) throws IOException {
            redirected = true;
            this.location = location;
            //IMPORTANT: don't call super() here
        }
    
        public boolean isRedirected() {
            return redirected;
        }
    
        public String getLocation() {
            return location;
        }
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-27
      • 2012-12-02
      • 2013-10-28
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多