2012-03-13 92 views
4

我有一种情况,我的前端开发人员想在每个链接中添加几个参数。他需要那些作为链接所指向的视图中的参数。Spring MVC - 在重定向后保留请求参数

每个@Controller方法将只返回字符串。这是通过使用该字符串作为视图名标准的ViewResolver支持:

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

每当控制器返回。然而redirect:,从原来的请求的请求参数被丢弃,他不能在.JSP访问它们

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

回答

2

由于Bozho提出的解决方案不能满足我的需求,所以我写了一个完全符合我需要的滤波器。不知道是否可能发生在未来的情况下,任何问题,但在那之前,随意使用我的实现:

/** 
* 
* @author Lennart Koester (University of Innsbruck, 2012) 
*/ 
@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; 
    } 

} 
} 
3

你需要一个闪光范围。它已经从春季3.1.RC1开始实施 - see the request

+0

所以我基本都从'@ Controller'方法与'RedirectAttributesModelMap',它取代我的'ModelMap'应该管用? – chzbrgla 2012-03-13 14:46:04

+0

我不完全确定它是如何工作的 - 也许Rossen Stoyanchev最后的评论应该有所提示。请让我知道它是否有效。 – Bozho 2012-03-13 14:52:59

+0

从它的第一个外观来看,它不起作用。 'RedirectAttributesModelMap'不能用作'ModelMap'的替代品,因为每个值都将以字符串表示形式存储。我的大多数方法都需要存储和处理对象,并通过ModelMap传递。 – chzbrgla 2012-03-13 15:01:23