2012-03-13 101 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